From e263be2000a237e694a07c498151122c2169ce95 Mon Sep 17 00:00:00 2001 From: Jeff Biseda Date: Fri, 20 May 2022 17:59:23 -0700 Subject: [PATCH] handle start_http failure in rpc_service (#25400) --- core/src/validator.rs | 47 ++++++++++++++++++++++++------------------ rpc/src/rpc_service.rs | 14 +++++++------ 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index 16acf402dc..86ba1b1284 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -769,27 +769,34 @@ impl Validator { } else { None }; + + let json_rpc_service = JsonRpcService::new( + rpc_addr, + config.rpc_config.clone(), + config.snapshot_config.clone(), + bank_forks.clone(), + block_commitment_cache.clone(), + blockstore.clone(), + cluster_info.clone(), + Some(poh_recorder.clone()), + genesis_config.hash(), + ledger_path, + config.validator_exit.clone(), + config.known_validators.clone(), + rpc_override_health_check.clone(), + optimistically_confirmed_bank.clone(), + config.send_transaction_service_config.clone(), + max_slots.clone(), + leader_schedule_cache.clone(), + max_complete_transaction_status_slot, + ) + .unwrap_or_else(|s| { + error!("Failed to create JSON RPC Service: {}", s); + abort(); + }); + ( - Some(JsonRpcService::new( - rpc_addr, - config.rpc_config.clone(), - config.snapshot_config.clone(), - bank_forks.clone(), - block_commitment_cache.clone(), - blockstore.clone(), - cluster_info.clone(), - Some(poh_recorder.clone()), - genesis_config.hash(), - ledger_path, - config.validator_exit.clone(), - config.known_validators.clone(), - rpc_override_health_check.clone(), - optimistically_confirmed_bank.clone(), - config.send_transaction_service_config.clone(), - max_slots.clone(), - leader_schedule_cache.clone(), - max_complete_transaction_status_slot, - )), + Some(json_rpc_service), if !config.rpc_config.full_api { None } else { diff --git a/rpc/src/rpc_service.rs b/rpc/src/rpc_service.rs index 26349d0a5f..62599c35b9 100644 --- a/rpc/src/rpc_service.rs +++ b/rpc/src/rpc_service.rs @@ -353,7 +353,7 @@ impl JsonRpcService { max_slots: Arc, leader_schedule_cache: Arc, current_transaction_status_slot: Arc, - ) -> Self { + ) -> Result { info!("rpc bound to {:?}", rpc_addr); info!("rpc configuration: {:?}", config); let rpc_threads = 1.max(config.rpc_threads); @@ -519,28 +519,29 @@ impl JsonRpcService { e, rpc_addr.port() ); + close_handle_sender.send(Err(e.to_string())).unwrap(); return; } let server = server.unwrap(); - close_handle_sender.send(server.close_handle()).unwrap(); + close_handle_sender.send(Ok(server.close_handle())).unwrap(); server.wait(); exit_bigtable_ledger_upload_service.store(true, Ordering::Relaxed); }) .unwrap(); - let close_handle = close_handle_receiver.recv().unwrap(); + let close_handle = close_handle_receiver.recv().unwrap()?; let close_handle_ = close_handle.clone(); validator_exit .write() .unwrap() .register_exit(Box::new(move || close_handle_.close())); - Self { + Ok(Self { thread_hdl, #[cfg(test)] request_processor: test_request_processor, close_handle: Some(close_handle), - } + }) } pub fn exit(&mut self) { @@ -632,7 +633,8 @@ mod tests { Arc::new(MaxSlots::default()), Arc::new(LeaderScheduleCache::default()), Arc::new(AtomicU64::default()), - ); + ) + .unwrap(); let thread = rpc_service.thread_hdl.thread(); assert_eq!(thread.name().unwrap(), "solana-jsonrpc");