Skip to content

Commit

Permalink
rpc server: make possible to disable/enable batch requests (paritytec…
Browse files Browse the repository at this point in the history
…h#3364)

The rationale behind this, is that it may be useful for some users
actually disable RPC batch requests or limit them by length instead of
the total size bytes of the batch.

This PR adds two new CLI options:

```
--rpc-disable-batch-requests - disable batch requests on the server
--rpc-max-batch-request-len <LEN> - limit batches to LEN on the server.
```
  • Loading branch information
niklasad1 authored Feb 20, 2024
1 parent 81370df commit 277bc78
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 7 deletions.
3 changes: 2 additions & 1 deletion substrate/bin/node/cli/benches/block_production.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use sc_consensus::{
use sc_service::{
config::{
BlocksPruning, DatabaseSource, KeystoreConfig, NetworkConfiguration, OffchainWorkerConfig,
PruningMode, WasmExecutionMethod, WasmtimeInstantiationStrategy,
PruningMode, RpcBatchRequestConfig, WasmExecutionMethod, WasmtimeInstantiationStrategy,
},
BasePath, Configuration, Role,
};
Expand Down Expand Up @@ -84,6 +84,7 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
rpc_max_subs_per_conn: Default::default(),
rpc_port: 9944,
rpc_message_buffer_capacity: Default::default(),
rpc_batch_config: RpcBatchRequestConfig::Unlimited,
rpc_rate_limit: None,
prometheus_config: None,
telemetry_endpoints: None,
Expand Down
3 changes: 2 additions & 1 deletion substrate/bin/node/cli/benches/transaction_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use node_primitives::AccountId;
use sc_service::{
config::{
BlocksPruning, DatabaseSource, KeystoreConfig, NetworkConfiguration, OffchainWorkerConfig,
PruningMode, TransactionPoolOptions,
PruningMode, RpcBatchRequestConfig, TransactionPoolOptions,
},
BasePath, Configuration, Role,
};
Expand Down Expand Up @@ -80,6 +80,7 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
rpc_max_subs_per_conn: Default::default(),
rpc_port: 9944,
rpc_message_buffer_capacity: Default::default(),
rpc_batch_config: RpcBatchRequestConfig::Unlimited,
rpc_rate_limit: None,
prometheus_config: None,
telemetry_endpoints: None,
Expand Down
26 changes: 25 additions & 1 deletion substrate/client/cli/src/commands/run_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ use crate::{
use clap::Parser;
use regex::Regex;
use sc_service::{
config::{BasePath, PrometheusConfig, TransactionPoolOptions},
config::{BasePath, PrometheusConfig, RpcBatchRequestConfig, TransactionPoolOptions},
ChainSpec, Role,
};
use sc_telemetry::TelemetryEndpoints;
Expand Down Expand Up @@ -125,6 +125,14 @@ pub struct RunCmd {
#[arg(long, default_value_t = RPC_DEFAULT_MESSAGE_CAPACITY_PER_CONN)]
pub rpc_message_buffer_capacity_per_connection: u32,

/// Disable RPC batch requests
#[arg(long, alias = "rpc_no_batch_requests", conflicts_with_all = &["rpc_max_batch_request_len"])]
pub rpc_disable_batch_requests: bool,

/// Limit the max length per RPC batch request
#[arg(long, conflicts_with_all = &["rpc_disable_batch_requests"], value_name = "LEN")]
pub rpc_max_batch_request_len: Option<u32>,

/// Specify browser *origins* allowed to access the HTTP & WS RPC servers.
///
/// A comma-separated list of origins (protocol://domain or special `null`
Expand Down Expand Up @@ -411,6 +419,22 @@ impl CliConfiguration for RunCmd {
Ok(self.rpc_max_subscriptions_per_connection)
}

fn rpc_buffer_capacity_per_connection(&self) -> Result<u32> {
Ok(self.rpc_message_buffer_capacity_per_connection)
}

fn rpc_batch_config(&self) -> Result<RpcBatchRequestConfig> {
let cfg = if self.rpc_disable_batch_requests {
RpcBatchRequestConfig::Disabled
} else if let Some(l) = self.rpc_max_batch_request_len {
RpcBatchRequestConfig::Limit(l)
} else {
RpcBatchRequestConfig::Unlimited
};

Ok(cfg)
}

fn rpc_rate_limit(&self) -> Result<Option<NonZeroU32>> {
Ok(self.rpc_rate_limit)
}
Expand Down
11 changes: 9 additions & 2 deletions substrate/client/cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ use sc_service::{
config::{
BasePath, Configuration, DatabaseSource, KeystoreConfig, NetworkConfiguration,
NodeKeyConfig, OffchainWorkerConfig, OutputFormat, PrometheusConfig, PruningMode, Role,
RpcMethods, TelemetryEndpoints, TransactionPoolOptions, WasmExecutionMethod,
RpcBatchRequestConfig, RpcMethods, TelemetryEndpoints, TransactionPoolOptions,
WasmExecutionMethod,
},
BlocksPruning, ChainSpec, TracingReceiver,
};
Expand Down Expand Up @@ -338,7 +339,12 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
Ok(RPC_DEFAULT_MESSAGE_CAPACITY_PER_CONN)
}

/// Rate limit calls per minute.
/// RPC server batch request configuration.
fn rpc_batch_config(&self) -> Result<RpcBatchRequestConfig> {
Ok(RpcBatchRequestConfig::Unlimited)
}

/// RPC rate limit configuration.
fn rpc_rate_limit(&self) -> Result<Option<NonZeroU32>> {
Ok(None)
}
Expand Down Expand Up @@ -515,6 +521,7 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
rpc_max_subs_per_conn: self.rpc_max_subscriptions_per_connection()?,
rpc_port: DCV::rpc_listen_port(),
rpc_message_buffer_capacity: self.rpc_buffer_capacity_per_connection()?,
rpc_batch_config: self.rpc_batch_config()?,
rpc_rate_limit: self.rpc_rate_limit()?,
prometheus_config: self
.prometheus_config(DCV::prometheus_listen_port(), &chain_spec)?,
Expand Down
1 change: 1 addition & 0 deletions substrate/client/cli/src/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ mod tests {
rpc_max_subs_per_conn: Default::default(),
rpc_message_buffer_capacity: Default::default(),
rpc_port: 9944,
rpc_batch_config: sc_service::config::RpcBatchRequestConfig::Unlimited,
rpc_rate_limit: None,
prometheus_config: None,
telemetry_endpoints: None,
Expand Down
6 changes: 5 additions & 1 deletion substrate/client/rpc-servers/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ pub use jsonrpsee::{
id_providers::{RandomIntegerIdProvider, RandomStringIdProvider},
traits::IdProvider,
},
server::middleware::rpc::RpcServiceBuilder,
server::{middleware::rpc::RpcServiceBuilder, BatchRequestConfig},
};
pub use middleware::{MetricsLayer, RateLimitLayer, RpcMetrics};

Expand Down Expand Up @@ -81,6 +81,8 @@ pub struct Config<'a, M: Send + Sync + 'static> {
pub id_provider: Option<Box<dyn IdProvider>>,
/// Tokio runtime handle.
pub tokio_handle: tokio::runtime::Handle,
/// Batch request config.
pub batch_config: BatchRequestConfig,
/// Rate limit calls per minute.
pub rate_limit: Option<NonZeroU32>,
}
Expand All @@ -103,6 +105,7 @@ where
{
let Config {
addrs,
batch_config,
cors,
max_payload_in_mb,
max_payload_out_mb,
Expand Down Expand Up @@ -139,6 +142,7 @@ where
)
.set_http_middleware(http_middleware)
.set_message_buffer_capacity(message_buffer_capacity)
.set_batch_request_config(batch_config)
.custom_tokio_runtime(tokio_handle.clone());

if let Some(provider) = id_provider {
Expand Down
3 changes: 3 additions & 0 deletions substrate/client/service/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

//! Service configuration.
pub use jsonrpsee::server::BatchRequestConfig as RpcBatchRequestConfig;
use prometheus_endpoint::Registry;
use sc_chain_spec::ChainSpec;
pub use sc_client_db::{BlocksPruning, Database, DatabaseSource, PruningMode};
Expand Down Expand Up @@ -103,6 +104,8 @@ pub struct Configuration {
pub rpc_port: u16,
/// The number of messages the JSON-RPC server is allowed to keep in memory.
pub rpc_message_buffer_capacity: u32,
/// JSON-RPC server batch config.
pub rpc_batch_config: RpcBatchRequestConfig,
/// RPC rate limit per minute.
pub rpc_rate_limit: Option<NonZeroU32>,
/// Prometheus endpoint configuration. `None` if disabled.
Expand Down
1 change: 1 addition & 0 deletions substrate/client/service/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ where

let server_config = sc_rpc_server::Config {
addrs: [addr, backup_addr],
batch_config: config.rpc_batch_config,
max_connections: config.rpc_max_connections,
max_payload_in_mb: config.rpc_max_request_size,
max_payload_out_mb: config.rpc_max_response_size,
Expand Down
3 changes: 2 additions & 1 deletion substrate/client/service/test/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use sc_network::{
use sc_network_sync::SyncingService;
use sc_service::{
client::Client,
config::{BasePath, DatabaseSource, KeystoreConfig},
config::{BasePath, DatabaseSource, KeystoreConfig, RpcBatchRequestConfig},
BlocksPruning, ChainSpecExtension, Configuration, Error, GenericChainSpec, Role,
RuntimeGenesis, SpawnTaskHandle, TaskManager,
};
Expand Down Expand Up @@ -254,6 +254,7 @@ fn node_config<
rpc_max_subs_per_conn: Default::default(),
rpc_port: 9944,
rpc_message_buffer_capacity: Default::default(),
rpc_batch_config: RpcBatchRequestConfig::Unlimited,
rpc_rate_limit: None,
prometheus_config: None,
telemetry_endpoints: None,
Expand Down

0 comments on commit 277bc78

Please sign in to comment.