From eae869329bca36194bfcfd6baf0a3ec87daf43f8 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 26 Nov 2025 13:42:42 +0900 Subject: [PATCH] server: add connection counter --- src/server/server_loop.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/server/server_loop.rs b/src/server/server_loop.rs index 1f391e0..90d8975 100644 --- a/src/server/server_loop.rs +++ b/src/server/server_loop.rs @@ -3,12 +3,17 @@ use std::{ fs, os::unix::{io::FromRawFd, net::UnixListener as StdUnixListener}, path::PathBuf, + sync::Arc, + time::Duration, }; use anyhow::Context; use futures_util::{SinkExt, StreamExt}; use indoc::concatdoc; -use tokio::net::{UnixListener as TokioUnixListener, UnixStream as TokioUnixStream}; +use tokio::{ + net::{UnixListener as TokioUnixListener, UnixStream as TokioUnixStream}, + time::interval, +}; use sqlx::MySqlConnection; use sqlx::prelude::*; @@ -89,6 +94,22 @@ pub async fn listen_for_incoming_connections_with_listener( listener: TokioUnixListener, config: ServerConfig, ) -> anyhow::Result<()> { + let connection_counter = Arc::new(()); + let connection_counter_for_log = Arc::clone(&connection_counter); + tokio::spawn(async move { + let mut interval = interval(Duration::from_secs(1)); + loop { + interval.tick().await; + let count = Arc::strong_count(&connection_counter_for_log) - 2; + let message = if count > 0 { + format!("Handling {} connections", count) + } else { + "Waiting for connections".to_string() + }; + sd_notify::notify(false, &[sd_notify::NotifyState::Status(message.as_str())]).ok(); + } + }); + sd_notify::notify(false, &[sd_notify::NotifyState::Ready]).ok(); while let Ok((conn, _addr)) = listener.accept().await { @@ -111,6 +132,8 @@ pub async fn listen_for_incoming_connections_with_listener( } }; + let _connection_counter_guard = Arc::clone(&connection_counter); + log::debug!("Accepted connection from uid {}", uid); let unix_user = match UnixUser::from_uid(uid) {