handle start_http failure in rpc_service (#25400)

This commit is contained in:
Jeff Biseda 2022-05-20 17:59:23 -07:00 committed by GitHub
parent e025376719
commit e263be2000
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 26 deletions

View File

@ -769,27 +769,34 @@ impl Validator {
} else { } else {
None 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( Some(json_rpc_service),
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,
)),
if !config.rpc_config.full_api { if !config.rpc_config.full_api {
None None
} else { } else {

View File

@ -353,7 +353,7 @@ impl JsonRpcService {
max_slots: Arc<MaxSlots>, max_slots: Arc<MaxSlots>,
leader_schedule_cache: Arc<LeaderScheduleCache>, leader_schedule_cache: Arc<LeaderScheduleCache>,
current_transaction_status_slot: Arc<AtomicU64>, current_transaction_status_slot: Arc<AtomicU64>,
) -> Self { ) -> Result<Self, String> {
info!("rpc bound to {:?}", rpc_addr); info!("rpc bound to {:?}", rpc_addr);
info!("rpc configuration: {:?}", config); info!("rpc configuration: {:?}", config);
let rpc_threads = 1.max(config.rpc_threads); let rpc_threads = 1.max(config.rpc_threads);
@ -519,28 +519,29 @@ impl JsonRpcService {
e, e,
rpc_addr.port() rpc_addr.port()
); );
close_handle_sender.send(Err(e.to_string())).unwrap();
return; return;
} }
let server = server.unwrap(); let server = server.unwrap();
close_handle_sender.send(server.close_handle()).unwrap(); close_handle_sender.send(Ok(server.close_handle())).unwrap();
server.wait(); server.wait();
exit_bigtable_ledger_upload_service.store(true, Ordering::Relaxed); exit_bigtable_ledger_upload_service.store(true, Ordering::Relaxed);
}) })
.unwrap(); .unwrap();
let close_handle = close_handle_receiver.recv().unwrap(); let close_handle = close_handle_receiver.recv().unwrap()?;
let close_handle_ = close_handle.clone(); let close_handle_ = close_handle.clone();
validator_exit validator_exit
.write() .write()
.unwrap() .unwrap()
.register_exit(Box::new(move || close_handle_.close())); .register_exit(Box::new(move || close_handle_.close()));
Self { Ok(Self {
thread_hdl, thread_hdl,
#[cfg(test)] #[cfg(test)]
request_processor: test_request_processor, request_processor: test_request_processor,
close_handle: Some(close_handle), close_handle: Some(close_handle),
} })
} }
pub fn exit(&mut self) { pub fn exit(&mut self) {
@ -632,7 +633,8 @@ mod tests {
Arc::new(MaxSlots::default()), Arc::new(MaxSlots::default()),
Arc::new(LeaderScheduleCache::default()), Arc::new(LeaderScheduleCache::default()),
Arc::new(AtomicU64::default()), Arc::new(AtomicU64::default()),
); )
.unwrap();
let thread = rpc_service.thread_hdl.thread(); let thread = rpc_service.thread_hdl.thread();
assert_eq!(thread.name().unwrap(), "solana-jsonrpc"); assert_eq!(thread.name().unwrap(), "solana-jsonrpc");