diff --git a/Cargo.lock b/Cargo.lock index 81d6de19..a03768bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6992,6 +6992,7 @@ dependencies = [ "enclave-api", "lcp-proto", "lcp-types", + "log", "store", "tokio", "tonic 0.9.2", diff --git a/app/src/commands/service.rs b/app/src/commands/service.rs index 7c66c98f..685882f4 100644 --- a/app/src/commands/service.rs +++ b/app/src/commands/service.rs @@ -61,7 +61,7 @@ impl ServiceCmd { let srv = AppService::new(opts.get_home(), enclave); info!("start service: addr={addr} mrenclave={mrenclave}"); - run_service(srv, rt, addr) + rt.block_on(async { run_service(srv, addr).await }) } } } diff --git a/modules/service/Cargo.toml b/modules/service/Cargo.toml index f26584a5..9b4c4a3c 100644 --- a/modules/service/Cargo.toml +++ b/modules/service/Cargo.toml @@ -8,6 +8,7 @@ tonic = { version = "0.9", default-features = false } tonic-reflection = { version = "0.9" } tokio = { version = "1.0", features = ["full"] } anyhow = { version = "1.0.56" } +log = { version = "0.4.8" } lcp-types = { path = "../types" } crypto = { path = "../crypto" } diff --git a/modules/service/src/service.rs b/modules/service/src/service.rs index 5ad80fd1..c90eb233 100644 --- a/modules/service/src/service.rs +++ b/modules/service/src/service.rs @@ -4,9 +4,10 @@ use lcp_proto::lcp::service::{ elc::v1::{msg_server::MsgServer as ELCMsgServer, query_server::QueryServer as ELCQueryServer}, enclave::v1::query_server::QueryServer as EnclaveQueryServer, }; +use log::*; use std::{marker::PhantomData, net::SocketAddr, path::PathBuf, sync::Arc}; use store::transaction::CommitStore; -use tokio::runtime::Runtime; +use tokio::signal::unix::{signal, SignalKind}; use tonic::transport::Server; pub struct AppService @@ -47,7 +48,7 @@ where } } -pub fn run_service(srv: AppService, rt: Arc, addr: SocketAddr) -> Result<()> +pub async fn run_service(srv: AppService, addr: SocketAddr) -> Result<()> where S: CommitStore, E: EnclaveProtoAPI, @@ -59,15 +60,26 @@ where .register_encoded_file_descriptor_set(lcp_proto::FILE_DESCRIPTOR_SET) .build() .expect("failed to create gRPC reflection servicer"); - rt.block_on(async { - Server::builder() - .add_service(elc_msg_srv) - .add_service(elc_query_srv) - .add_service(enclave_srv) - .add_service(reflection) - .serve(addr) - .await - .unwrap(); - }); + + let mut sigint = signal(SignalKind::interrupt()).expect("failed to set SIGINT handler"); + let mut sigterm = signal(SignalKind::terminate()).expect("failed to set SIGTERM handler"); + let shutdown_signal = async { + let signal_type = tokio::select! { + _ = sigint.recv() => "SIGINT", + _ = sigterm.recv() => "SIGTERM", + }; + info!( + "shutdown signal ({}) received, stopping server", + signal_type + ); + }; + Server::builder() + .add_service(elc_msg_srv) + .add_service(elc_query_srv) + .add_service(enclave_srv) + .add_service(reflection) + .serve_with_shutdown(addr, shutdown_signal) + .await?; + info!("server stopped"); Ok(()) }