mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 13:31:10 +00:00
rpc server: make possible to disable/enable batch requests (#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. ```
This commit is contained in:
@@ -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;
|
||||
@@ -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`
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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)?,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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>,
|
||||
}
|
||||
@@ -103,6 +105,7 @@ where
|
||||
{
|
||||
let Config {
|
||||
addrs,
|
||||
batch_config,
|
||||
cors,
|
||||
max_payload_in_mb,
|
||||
max_payload_out_mb,
|
||||
@@ -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 {
|
||||
|
||||
@@ -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};
|
||||
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user