@@ -27,6 +27,7 @@ use stackable_operator::{
2727 logging:: controller:: report_controller_reconciled,
2828 shared:: yaml:: SerializeOptions ,
2929 telemetry:: Tracing ,
30+ utils:: signal:: SignalWatcher ,
3031} ;
3132use strum:: { EnumDiscriminants , IntoStaticStr } ;
3233
@@ -68,6 +69,11 @@ pub enum Error {
6869 CreateClient {
6970 source : stackable_operator:: client:: Error ,
7071 } ,
72+
73+ #[ snafu( display( "failed to create SIGTERM signal watcher" ) ) ]
74+ CreateSignalWatcher {
75+ source : stackable_operator:: utils:: signal:: SignalError ,
76+ } ,
7177}
7278
7379#[ derive( clap:: Parser ) ]
@@ -109,10 +115,14 @@ async fn main() -> Result<()> {
109115 description = built_info:: PKG_DESCRIPTION
110116 ) ;
111117
118+ // Watches for the SIGTERM signal and sends a signal to all receivers, which gracefully
119+ // shuts down all concurrent tasks below (EoS checker, controller).
120+ let sigterm_watcher = SignalWatcher :: sigterm ( ) . context ( CreateSignalWatcherSnafu ) ?;
121+
112122 let eos_checker =
113123 EndOfSupportChecker :: new ( built_info:: BUILT_TIME_UTC , maintenance. end_of_support )
114124 . context ( InitEndOfSupportCheckerSnafu ) ?
115- . run ( )
125+ . run ( sigterm_watcher . handle ( ) )
116126 . map ( Ok ) ;
117127
118128 let operator_name = OperatorName :: from_str ( "opensearch.stackable.tech" )
@@ -168,7 +178,7 @@ async fn main() -> Result<()> {
168178 watch_namespace. get_api :: < DeserializeGuard < StatefulSet > > ( & client) ,
169179 watcher:: Config :: default ( ) ,
170180 )
171- . shutdown_on_signal ( )
181+ . graceful_shutdown_on ( sigterm_watcher . handle ( ) )
172182 . run (
173183 controller:: reconcile,
174184 controller:: error_policy,
0 commit comments