Make it possible to override maximum payload of RPC (#9019)

* Make it possible to override maximum payload of RPC

* Finish it.

* remove todo.

* Update client/cli/src/commands/run_cmd.rs

* Apply suggestions from code review

Co-authored-by: David <dvdplm@gmail.com>

* Apply suggestions from code review

Co-authored-by: David <dvdplm@gmail.com>

* Incorporate suggestions

* Thread rpc_max_payload from configuration to trace_block

* Try obey line gitlab/check_line_width.sh

* update state rpc tests

* Improve readbility

* Apply suggestions from code review

* Apply suggestions from code review

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
Co-authored-by: Zeke Mostov <32168567+emostov@users.noreply.github.com>
Co-authored-by: David <dvdplm@gmail.com>
This commit is contained in:
Kian Paimani
2021-06-17 16:37:43 +02:00
committed by GitHub
parent 1278b9a6d4
commit 4d6802c530
14 changed files with 87 additions and 26 deletions
+8 -3
View File
@@ -22,7 +22,7 @@ use parking_lot::Mutex;
use tracing::{Dispatch, dispatcher, Subscriber, Level, span::{Attributes, Record, Id}};
use sc_client_api::BlockBackend;
use sc_rpc_server::MAX_PAYLOAD;
use sc_rpc_server::RPC_MAX_PAYLOAD_DEFAULT;
use sp_api::{Core, Metadata, ProvideRuntimeApi, Encode};
use sp_blockchain::HeaderBackend;
use sp_runtime::{
@@ -54,6 +54,7 @@ const DEFAULT_TARGETS: &str = "pallet,frame,state";
const TRACE_TARGET: &str = "block_trace";
// The name of a field required for all events.
const REQUIRED_EVENT_FIELD: &str = "method";
const MEGABYTE: usize = 1024 * 1024;
/// Tracing Block Result type alias
pub type TraceBlockResult<T> = Result<T, Error>;
@@ -174,6 +175,7 @@ pub struct BlockExecutor<Block: BlockT, Client> {
block: Block::Hash,
targets: Option<String>,
storage_keys: Option<String>,
rpc_max_payload: usize,
}
impl<Block, Client> BlockExecutor<Block, Client>
@@ -189,8 +191,11 @@ impl<Block, Client> BlockExecutor<Block, Client>
block: Block::Hash,
targets: Option<String>,
storage_keys: Option<String>,
rpc_max_payload: Option<usize>,
) -> Self {
Self { client, block, targets, storage_keys }
let rpc_max_payload = rpc_max_payload.map(|mb| mb.saturating_mul(MEGABYTE))
.unwrap_or(RPC_MAX_PAYLOAD_DEFAULT);
Self { client, block, targets, storage_keys, rpc_max_payload }
}
/// Execute block, record all spans and events belonging to `Self::targets`
@@ -260,7 +265,7 @@ impl<Block, Client> BlockExecutor<Block, Client>
tracing::debug!(target: "state_tracing", "Captured {} spans and {} events", spans.len(), events.len());
let approx_payload_size = BASE_PAYLOAD + events.len() * AVG_EVENT + spans.len() * AVG_SPAN;
let response = if approx_payload_size > MAX_PAYLOAD {
let response = if approx_payload_size > self.rpc_max_payload {
TraceBlockResponse::TraceError(TraceError {
error:
"Payload likely exceeds max payload size of RPC server.".to_string()