@@ -4,9 +4,10 @@ use lcp_proto::lcp::service::{
44 elc:: v1:: { msg_server:: MsgServer as ELCMsgServer , query_server:: QueryServer as ELCQueryServer } ,
55 enclave:: v1:: query_server:: QueryServer as EnclaveQueryServer ,
66} ;
7+ use log:: * ;
78use std:: { marker:: PhantomData , net:: SocketAddr , path:: PathBuf , sync:: Arc } ;
89use store:: transaction:: CommitStore ;
9- use tokio:: runtime :: Runtime ;
10+ use tokio:: signal :: unix :: { signal , SignalKind } ;
1011use tonic:: transport:: Server ;
1112
1213pub struct AppService < E , S >
4748 }
4849}
4950
50- pub fn run_service < E , S > ( srv : AppService < E , S > , rt : Arc < Runtime > , addr : SocketAddr ) -> Result < ( ) >
51+ pub async fn run_service < E , S > ( srv : AppService < E , S > , addr : SocketAddr ) -> Result < ( ) >
5152where
5253 S : CommitStore ,
5354 E : EnclaveProtoAPI < S > ,
@@ -59,15 +60,23 @@ where
5960 . register_encoded_file_descriptor_set ( lcp_proto:: FILE_DESCRIPTOR_SET )
6061 . build ( )
6162 . expect ( "failed to create gRPC reflection servicer" ) ;
62- rt. block_on ( async {
63- Server :: builder ( )
64- . add_service ( elc_msg_srv)
65- . add_service ( elc_query_srv)
66- . add_service ( enclave_srv)
67- . add_service ( reflection)
68- . serve ( addr)
69- . await
70- . unwrap ( ) ;
71- } ) ;
63+
64+ let mut sigint = signal ( SignalKind :: interrupt ( ) ) . expect ( "failed to set SIGINT handler" ) ;
65+ let mut sigterm = signal ( SignalKind :: terminate ( ) ) . expect ( "failed to set SIGTERM handler" ) ;
66+ let shutdown_signal = async {
67+ let signal_type = tokio:: select! {
68+ _ = sigint. recv( ) => "SIGINT" ,
69+ _ = sigterm. recv( ) => "SIGTERM" ,
70+ } ;
71+ info ! ( "shutdown signal ({}) received, stopping server" , signal_type) ;
72+ } ;
73+ Server :: builder ( )
74+ . add_service ( elc_msg_srv)
75+ . add_service ( elc_query_srv)
76+ . add_service ( enclave_srv)
77+ . add_service ( reflection)
78+ . serve_with_shutdown ( addr, shutdown_signal)
79+ . await ?;
80+ info ! ( "server stopped" ) ;
7281 Ok ( ( ) )
7382}
0 commit comments