From 747f8d5877f79a3031874dedc275c1e96062a623 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Thu, 20 Aug 2020 15:05:30 -0600 Subject: [PATCH] Rpc: Return error if block does not exist (#11743) * Return error if block does not exist * Update docs --- core/src/rpc.rs | 6 +++--- core/src/rpc_error.rs | 9 +++++++++ docs/src/apps/jsonrpc-api.md | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 203564042..722e6ec48 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -625,7 +625,7 @@ impl JsonRpcRequestProcessor { self.check_slot_cleaned_up(&result, slot)?; Ok(result.ok()) } else { - Ok(None) + Err(RpcCustomError::BlockNotAvailable { slot }.into()) } } @@ -697,7 +697,7 @@ impl JsonRpcRequestProcessor { self.check_slot_cleaned_up(&result, slot)?; Ok(result.ok().unwrap_or(None)) } else { - Ok(None) + Err(RpcCustomError::BlockNotAvailable { slot }.into()) } } @@ -4484,7 +4484,7 @@ pub mod tests { slot ); let res = io.handle_request_sync(&req, meta); - let expected = r#"{"jsonrpc":"2.0","result":null,"id":1}"#; + let expected = r#"{"jsonrpc":"2.0","error":{"code":-32004,"message":"Block not available for slot 12345"},"id":1}"#; let expected: Response = serde_json::from_str(&expected).expect("expected response deserialization"); let result: Response = serde_json::from_str(&res.expect("actual response")) diff --git a/core/src/rpc_error.rs b/core/src/rpc_error.rs index e452c2d98..f9c0f15c8 100644 --- a/core/src/rpc_error.rs +++ b/core/src/rpc_error.rs @@ -4,6 +4,7 @@ use solana_sdk::clock::Slot; const JSON_RPC_SERVER_ERROR_1: i64 = -32001; const JSON_RPC_SERVER_ERROR_2: i64 = -32002; const JSON_RPC_SERVER_ERROR_3: i64 = -32003; +const JSON_RPC_SERVER_ERROR_4: i64 = -32004; pub enum RpcCustomError { BlockCleanedUp { @@ -14,6 +15,9 @@ pub enum RpcCustomError { message: String, }, SendTransactionIsNotSigned, + BlockNotAvailable { + slot: Slot, + }, } impl From for Error { @@ -40,6 +44,11 @@ impl From for Error { message: "Transaction is not signed".to_string(), data: None, }, + RpcCustomError::BlockNotAvailable { slot } => Self { + code: ErrorCode::ServerError(JSON_RPC_SERVER_ERROR_4), + message: format!("Block not available for slot {}", slot,), + data: None, + }, } } } diff --git a/docs/src/apps/jsonrpc-api.md b/docs/src/apps/jsonrpc-api.md index d2e7f7ec7..882b105b4 100644 --- a/docs/src/apps/jsonrpc-api.md +++ b/docs/src/apps/jsonrpc-api.md @@ -241,7 +241,7 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "m ### getBlockTime -Returns the estimated production time of a block. +Returns the estimated production time of a confirmed block. Each validator reports their UTC time to the ledger on a regular interval by intermittently adding a timestamp to a Vote for a particular block. A requested @@ -259,8 +259,8 @@ query a node that is built from genesis and retains the entire ledger. #### Results: -- `` - block has not yet been produced -- `` - estimated production time, as Unix timestamp (seconds since the Unix epoch) +* `` - estimated production time, as Unix timestamp (seconds since the Unix epoch) +* `` - timestamp is not available for this block #### Example: