diff --git a/crates/notify/src/factory.rs b/crates/notify/src/factory.rs index b7f4a5c3c..8b15caa0e 100644 --- a/crates/notify/src/factory.rs +++ b/crates/notify/src/factory.rs @@ -71,8 +71,7 @@ impl TargetFactory for WebhookTargetFactory { .map_err(|e| TargetError::Configuration(format!("Invalid endpoint URL: {} (value: '{}')", e, endpoint)))?; let auth_token = get(ENV_WEBHOOK_AUTH_TOKEN, WEBHOOK_AUTH_TOKEN).unwrap_or_default(); - let queue_dir = get(ENV_WEBHOOK_QUEUE_DIR, WEBHOOK_QUEUE_DIR) - .unwrap_or(DEFAULT_DIR.to_string()); + let queue_dir = get(ENV_WEBHOOK_QUEUE_DIR, WEBHOOK_QUEUE_DIR).unwrap_or(DEFAULT_DIR.to_string()); let queue_limit = get(ENV_WEBHOOK_QUEUE_LIMIT, WEBHOOK_QUEUE_LIMIT) .and_then(|v| v.parse::().ok()) diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 7deac4fab..c1fa1ce20 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -12,9 +12,9 @@ mod service; mod storage; use crate::auth::IAMAuth; -use crate::console::{CONSOLE_CONFIG, init_console_cfg}; +use crate::console::{init_console_cfg, CONSOLE_CONFIG}; // Ensure the correct path for parse_license is imported -use crate::server::{SHUTDOWN_TIMEOUT, ServiceState, ServiceStateManager, ShutdownSignal, wait_for_shutdown}; +use crate::server::{wait_for_shutdown, ServiceState, ServiceStateManager, ShutdownSignal, SHUTDOWN_TIMEOUT}; use bytes::Bytes; use chrono::Datelike; use clap::Parser; @@ -22,7 +22,6 @@ use common::{ // error::{Error, Result}, globals::set_global_addr, }; -use ecstore::StorageAPI; use ecstore::bucket::metadata_sys::init_bucket_metadata_sys; use ecstore::cmd::bucket_replication::init_bucket_replication_pool; use ecstore::config as ecconfig; @@ -30,11 +29,12 @@ use ecstore::config::GLOBAL_ConfigSys; use ecstore::heal::background_heal_ops::init_auto_heal; use ecstore::rpc::make_server; use ecstore::store_api::BucketOptions; +use ecstore::StorageAPI; use ecstore::{ endpoints::EndpointServerPools, heal::data_scanner::init_data_scanner, set_global_endpoints, - store::{ECStore, init_local_disks}, + store::{init_local_disks, ECStore}, update_erasure_type, }; use ecstore::{global::set_global_rustfs_port, notification_sys::new_global_notification_sys}; @@ -49,7 +49,7 @@ use iam::init_iam_sys; use license::init_license; use protos::proto_gen::node_service::node_service_server::NodeServiceServer; use rustfs_config::{DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY, RUSTFS_TLS_CERT, RUSTFS_TLS_KEY}; -use rustfs_obs::{SystemObserver, init_obs, set_global_guard}; +use rustfs_obs::{init_obs, set_global_guard, SystemObserver}; use rustfs_utils::net::parse_and_resolve_address; use rustls::ServerConfig; use s3s::{host::MultiDomain, service::S3ServiceBuilder}; @@ -60,12 +60,13 @@ use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; use tokio::net::TcpListener; -use tokio::signal::unix::{SignalKind, signal}; +#[cfg(unix)] +use tokio::signal::unix::{signal, SignalKind}; use tokio_rustls::TlsAcceptor; -use tonic::{Request, Status, metadata::MetadataValue}; +use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; use tower_http::trace::TraceLayer; -use tracing::{Span, debug, error, info, instrument, warn}; +use tracing::{debug, error, info, instrument, warn, Span}; const MI_B: usize = 1024 * 1024; @@ -302,20 +303,31 @@ async fn run(opt: config::Opt) -> Result<()> { let shutdown_tx_clone = shutdown_tx.clone(); tokio::spawn(async move { - // error handling improvements - let sigterm_inner = match signal(SignalKind::terminate()) { - Ok(signal) => signal, - Err(e) => { - error!("Failed to create SIGTERM signal handler: {}", e); - return; - } + #[cfg(unix)] + let (mut sigterm_inner, mut sigint_inner) = { + // Unix platform specific code + let sigterm_inner = match signal(SignalKind::terminate()) { + Ok(signal) => signal, + Err(e) => { + error!("Failed to create SIGTERM signal handler: {}", e); + return; + } + }; + let sigint_inner = match signal(SignalKind::interrupt()) { + Ok(signal) => signal, + Err(e) => { + error!("Failed to create SIGINT signal handler: {}", e); + return; + } + }; + (sigterm_inner, sigint_inner) }; - let sigint_inner = match signal(SignalKind::interrupt()) { - Ok(signal) => signal, - Err(e) => { - error!("Failed to create SIGINT signal handler: {}", e); - return; - } + + #[cfg(not(unix))] + let (mut sigterm_future, mut sigint_future) = { + // Windows platform uses Ctrl+C as the only signal source + // Create two never-finished futures as placeholders + (std::pin::pin!(std::future::pending::<()>()), std::pin::pin!(std::future::pending::<()>())) }; let mut sigterm_inner = sigterm_inner; @@ -396,11 +408,13 @@ async fn run(opt: config::Opt) -> Result<()> { break; } + #[cfg(unix)] _ = sigint_inner.recv() => { info!("SIGINT received in worker thread"); let _ = shutdown_tx_clone.send(()); break; } + #[cfg(unix)] _ = sigterm_inner.recv() => { info!("SIGTERM received in worker thread"); let _ = shutdown_tx_clone.send(()); @@ -425,24 +439,6 @@ async fn run(opt: config::Opt) -> Result<()> { if has_tls_certs { debug!("TLS certificates found, starting with SIGINT"); - // let tls_socket = match tls_acceptor - // .as_ref() - // .ok_or_else(|| rustfs_utils::certs_error("TLS not configured".to_string())) - // .map_err(|e| { - // error!("TLS panic error: {}", e); - // e - // }) - // .unwrap() - // .accept(socket) - // .await - // { - // Ok(tls_socket) => tls_socket, - // Err(err) => { - // error!("TLS handshake failed {}", err); - // continue; - // } - // }; - let peer_addr_str = socket.peer_addr().map(|a| a.to_string()).unwrap_or_else(|e| { warn!("Could not get peer address: {}", e); "unknown".to_string()