@@ -14,7 +14,10 @@ extern crate regex;
14
14
extern crate rust_log_analyzer as rla;
15
15
extern crate serde_json;
16
16
17
+ use crate :: server:: QueueItem ;
17
18
use clap:: Parser ;
19
+ use crossbeam:: channel:: Sender ;
20
+ use rla:: index:: IndexStorage ;
18
21
use std:: process;
19
22
use std:: sync:: Arc ;
20
23
use std:: thread;
@@ -47,7 +50,7 @@ struct Cli {
47
50
long = "index-file" ,
48
51
help = "The index file to read / write. An existing index file is updated."
49
52
) ]
50
- index_file : std :: path :: PathBuf ,
53
+ index_file : IndexStorage ,
51
54
#[ arg(
52
55
long = "debug-post" ,
53
56
help = "Post all comments to the given issue instead of the actual PR. Format: \" user/repo#id\" "
@@ -90,7 +93,10 @@ fn main() {
90
93
91
94
let ( queue_send, queue_recv) = crossbeam:: channel:: unbounded ( ) ;
92
95
93
- let service = Arc :: new ( server:: RlaService :: new ( args. webhook_verify , queue_send) ?) ;
96
+ let service = Arc :: new ( server:: RlaService :: new (
97
+ args. webhook_verify ,
98
+ queue_send. clone ( ) ,
99
+ ) ?) ;
94
100
95
101
let mut worker = server:: Worker :: new (
96
102
args. index_file ,
@@ -102,7 +108,7 @@ fn main() {
102
108
args. query_builds_from_primary_repo ,
103
109
) ?;
104
110
105
- thread:: spawn ( move || {
111
+ let worker_thread = thread:: spawn ( move || {
106
112
if let Err ( e) = worker. main ( ) {
107
113
error ! ( "Worker failed, exiting: {}" , e) ;
108
114
process:: exit ( 1 ) ;
@@ -125,9 +131,34 @@ fn main() {
125
131
} ) )
126
132
}
127
133
} ) )
134
+ . with_graceful_shutdown ( graceful_shutdown ( queue_send) )
128
135
. await
129
136
} ) ?;
130
137
138
+ worker_thread. join ( ) . expect ( "worker thread failed" ) ;
139
+
131
140
Ok ( ( ) )
132
141
} ) ;
133
142
}
143
+
144
+ async fn graceful_shutdown ( sender : Sender < QueueItem > ) {
145
+ let ctrl_c = tokio:: signal:: ctrl_c ( ) ;
146
+
147
+ // ECS uses SIGTERM to signal graceful shutdown must begin.
148
+ #[ cfg( unix) ]
149
+ let mut sigterm =
150
+ tokio:: signal:: unix:: signal ( tokio:: signal:: unix:: SignalKind :: terminate ( ) ) . unwrap ( ) ;
151
+ #[ cfg( unix) ]
152
+ let sigterm = sigterm. recv ( ) ;
153
+
154
+ #[ cfg( not( unix) ) ]
155
+ let sigterm = std:: future:: pending ( ) ; // Never resolves
156
+
157
+ tokio:: select! {
158
+ _ = ctrl_c => { }
159
+ _ = sigterm => { }
160
+ } ;
161
+
162
+ info ! ( "graceful shutdown signal received" ) ;
163
+ let _ = sender. send ( QueueItem :: GracefulShutdown ) ;
164
+ }
0 commit comments