Skip to content

Commit 659d174

Browse files
committed
Merge #1487: Fix shutdown message and improve it
8f42271 chore: [#1477] remove unused dependency (Jose Celano) 53fdafd feat: [#1477] extract JobManager to handle jobs (Jose Celano) faf8111 fix: [#1477] shutdown event listeners on CRTL+c signal (Jose Celano) e595190 refactor: [#1477] create an explicit job creation module for event listeners (Jose Celano) a29aaae feat: [#1477] add server address to http server shutdown logs (Jose Celano) bbc0154 feat: [#1477] add fallback timeout to graceful shutdown (Jose Celano) 797583b feat: [#1477] shut down http server inmediately is all coneections closed (Jose Celano) d5e7c36 feat: [#1477] improve shutting down message for http servers (Jose Celano) Pull request description: Fix shutdown message and improve it for HTTP servers (they all use Axum). ### Subtasks - [x] Hard timeout for shutdown. Stop the loop even when there are alive connections after the grace period. - [x] Show socket-bound address in logs. - [x] Fix bug, not showing the message passed as a parameter. - [x] Event listeners should listen to `CRTL+c` signal. Temporary solution until we implement: - #1405. - [x] Add a job manager to give a name to all jobs and identify them when the app shuts down. ACKs for top commit: josecelano: ACK 8f42271 Tree-SHA512: 5a8b726e5eb6362020e46c82a7dc85420c39d3e7b072f46ecf99fc282179f53e64a7bf979a055d351a7f76f65a1681572d657dbcc5bb42ba2409b77d230696dd
2 parents ef6c91d + 8f42271 commit 659d174

File tree

17 files changed

+332
-142
lines changed

17 files changed

+332
-142
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ bittorrent-tracker-core = { version = "3.0.0-develop", path = "packages/tracker-
4040
bittorrent-udp-tracker-core = { version = "3.0.0-develop", path = "packages/udp-tracker-core" }
4141
chrono = { version = "0", default-features = false, features = ["clock"] }
4242
clap = { version = "4", features = ["derive", "env"] }
43-
futures = "0"
4443
rand = "0"
4544
regex = "1"
4645
reqwest = { version = "0", features = ["json"] }

packages/axum-health-check-api-server/src/server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ pub fn start(
113113
handle.clone(),
114114
rx_halt,
115115
format!("Shutting down http server on socket address: {address}"),
116+
address,
116117
));
117118

118119
let running = axum_server::from_tcp(socket)

packages/axum-http-tracker-server/src/server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ impl Launcher {
6060
handle.clone(),
6161
rx_halt,
6262
format!("Shutting down HTTP server on socket address: {address}"),
63+
address,
6364
));
6465

6566
let tls = self.tls.clone();

packages/axum-rest-tracker-api-server/src/server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ impl Launcher {
257257
handle.clone(),
258258
rx_halt,
259259
format!("Shutting down tracker API server on socket address: {address}"),
260+
address,
260261
));
261262

262263
let tls = self.tls.clone();
Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,49 @@
1+
use std::net::SocketAddr;
12
use std::time::Duration;
23

3-
use tokio::time::sleep;
4+
use tokio::time::{sleep, Instant};
45
use torrust_server_lib::signals::{shutdown_signal_with_message, Halted};
56
use tracing::instrument;
67

78
#[instrument(skip(handle, rx_halt, message))]
8-
pub async fn graceful_shutdown(handle: axum_server::Handle, rx_halt: tokio::sync::oneshot::Receiver<Halted>, message: String) {
9-
shutdown_signal_with_message(rx_halt, message).await;
9+
pub async fn graceful_shutdown(
10+
handle: axum_server::Handle,
11+
rx_halt: tokio::sync::oneshot::Receiver<Halted>,
12+
message: String,
13+
address: SocketAddr,
14+
) {
15+
shutdown_signal_with_message(rx_halt, message.clone()).await;
1016

11-
tracing::debug!("Sending graceful shutdown signal");
12-
handle.graceful_shutdown(Some(Duration::from_secs(90)));
17+
let grace_period = Duration::from_secs(90);
18+
let max_wait = Duration::from_secs(95);
19+
let start = Instant::now();
1320

14-
println!("!! shuting down in 90 seconds !!");
21+
handle.graceful_shutdown(Some(grace_period));
22+
23+
tracing::info!("!! {} in {} seconds !!", message, grace_period.as_secs());
1524

1625
loop {
17-
sleep(Duration::from_secs(1)).await;
26+
if handle.connection_count() == 0 {
27+
tracing::info!("All connections closed, shutting down server in address {}", address);
28+
break;
29+
}
30+
31+
if start.elapsed() >= max_wait {
32+
tracing::warn!(
33+
"Shutdown timeout of {} seconds reached. Forcing shutdown in address {} with {} active connections.",
34+
max_wait.as_secs(),
35+
address,
36+
handle.connection_count()
37+
);
38+
break;
39+
}
1840

19-
tracing::info!("remaining alive connections: {}", handle.connection_count());
41+
tracing::info!(
42+
"Remaining alive connections: {} ({}s elapsed)",
43+
handle.connection_count(),
44+
start.elapsed().as_secs()
45+
);
46+
47+
sleep(Duration::from_secs(1)).await;
2048
}
2149
}

packages/http-tracker-core/src/statistics/event/listener.rs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,32 @@ pub fn run_event_listener(receiver: Receiver, repository: &Arc<Repository>) -> J
2323
}
2424

2525
async fn dispatch_events(mut receiver: Receiver, stats_repository: Arc<Repository>) {
26+
let shutdown_signal = tokio::signal::ctrl_c();
27+
28+
tokio::pin!(shutdown_signal);
29+
2630
loop {
27-
match receiver.recv().await {
28-
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
29-
Err(e) => {
30-
match e {
31-
RecvError::Closed => {
32-
tracing::info!(target: HTTP_TRACKER_LOG_TARGET, "Http core statistics receiver closed.");
33-
break;
34-
}
35-
RecvError::Lagged(n) => {
36-
// From now on, metrics will be imprecise
37-
tracing::warn!(target: HTTP_TRACKER_LOG_TARGET, "Http core statistics receiver lagged by {} events.", n);
31+
tokio::select! {
32+
biased;
33+
34+
_ = &mut shutdown_signal => {
35+
tracing::info!(target: HTTP_TRACKER_LOG_TARGET, "Received Ctrl+C, shutting down HTTP tracker core event listener.");
36+
break;
37+
}
38+
39+
result = receiver.recv() => {
40+
match result {
41+
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
42+
Err(e) => {
43+
match e {
44+
RecvError::Closed => {
45+
tracing::info!(target: HTTP_TRACKER_LOG_TARGET, "Http core statistics receiver closed.");
46+
break;
47+
}
48+
RecvError::Lagged(n) => {
49+
tracing::warn!(target: HTTP_TRACKER_LOG_TARGET, "Http core statistics receiver lagged by {} events.", n);
50+
}
51+
}
3852
}
3953
}
4054
}

packages/udp-tracker-core/src/statistics/event/listener.rs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,31 @@ pub fn run_event_listener(receiver: Receiver, repository: &Arc<Repository>) -> J
2323
}
2424

2525
async fn dispatch_events(mut receiver: Receiver, stats_repository: Arc<Repository>) {
26+
let shutdown_signal = tokio::signal::ctrl_c();
27+
tokio::pin!(shutdown_signal);
28+
2629
loop {
27-
match receiver.recv().await {
28-
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
29-
Err(e) => {
30-
match e {
31-
RecvError::Closed => {
32-
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Udp core statistics receiver closed.");
33-
break;
34-
}
35-
RecvError::Lagged(n) => {
36-
// From now on, metrics will be imprecise
37-
tracing::warn!(target: UDP_TRACKER_LOG_TARGET, "Udp core statistics receiver lagged by {} events.", n);
30+
tokio::select! {
31+
biased;
32+
33+
_ = &mut shutdown_signal => {
34+
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Received Ctrl+C, shutting down UDP tracker core event listener.");
35+
break;
36+
}
37+
38+
result = receiver.recv() => {
39+
match result {
40+
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
41+
Err(e) => {
42+
match e {
43+
RecvError::Closed => {
44+
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Udp core statistics receiver closed.");
45+
break;
46+
}
47+
RecvError::Lagged(n) => {
48+
tracing::warn!(target: UDP_TRACKER_LOG_TARGET, "Udp core statistics receiver lagged by {} events.", n);
49+
}
50+
}
3851
}
3952
}
4053
}

packages/udp-tracker-server/src/statistics/event/listener.rs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,36 @@ pub fn run_event_listener(receiver: Receiver, repository: &Arc<Repository>) -> J
1919
tokio::spawn(async move {
2020
dispatch_events(receiver, stats_repository).await;
2121

22-
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "DP tracker server event listener finished");
22+
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "UDP tracker server event listener finished");
2323
})
2424
}
2525

2626
async fn dispatch_events(mut receiver: Receiver, stats_repository: Arc<Repository>) {
27+
let shutdown_signal = tokio::signal::ctrl_c();
28+
tokio::pin!(shutdown_signal);
29+
2730
loop {
28-
match receiver.recv().await {
29-
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
30-
Err(e) => {
31-
match e {
32-
RecvError::Closed => {
33-
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Udp server statistics receiver closed.");
34-
break;
35-
}
36-
RecvError::Lagged(n) => {
37-
// From now on, metrics will be imprecise
38-
tracing::warn!(target: UDP_TRACKER_LOG_TARGET, "Udp server statistics receiver lagged by {} events.", n);
31+
tokio::select! {
32+
biased;
33+
34+
_ = &mut shutdown_signal => {
35+
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Received Ctrl+C, shutting down UDP tracker server event listener.");
36+
break;
37+
}
38+
39+
result = receiver.recv() => {
40+
match result {
41+
Ok(event) => handle_event(event, &stats_repository, CurrentClock::now()).await,
42+
Err(e) => {
43+
match e {
44+
RecvError::Closed => {
45+
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Udp server statistics receiver closed.");
46+
break;
47+
}
48+
RecvError::Lagged(n) => {
49+
tracing::warn!(target: UDP_TRACKER_LOG_TARGET, "Udp server statistics receiver lagged by {} events.", n);
50+
}
51+
}
3952
}
4053
}
4154
}

0 commit comments

Comments
 (0)