From 9c119a8c6006c1fdd7d3110b6a1474ca0657c0f9 Mon Sep 17 00:00:00 2001 From: Guillaume Bau Date: Tue, 22 Jul 2025 20:59:54 +0200 Subject: [PATCH 1/4] Tezt/Cloud: do not depend on logrotate to handle sighup --- tezt/lib_cloud/env.ml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tezt/lib_cloud/env.ml b/tezt/lib_cloud/env.ml index faaba9e4c2d9..aeb581eec87a 100644 --- a/tezt/lib_cloud/env.ml +++ b/tezt/lib_cloud/env.ml @@ -116,19 +116,18 @@ let init () = This allows logrotate to use a better strategy than copytruncate https://incoherency.co.uk/blog/stories/logrotate-copytruncate-race-condition.html *) - (if log_rotation <> 0 then - match Tezt_core.Cli.Logs.file with - | None -> () - | Some logfile -> - Log.report "Installing signal handler for SIGHUP" ; - let signal_hup_handler signal = - if signal = Sys.sighup then ( - (* TODO: Not sure if set_file is async-signal-safe. - Maybe implement a better solution if it causes issues *) - Tezt_core.Log.set_file logfile ; - Log.report "Logfile was reopened") - in - Sys.set_signal Sys.sighup (Sys.Signal_handle signal_hup_handler)) ; + (match Tezt_core.Cli.Logs.file with + | None -> () + | Some logfile -> + Log.report "Installing signal handler for SIGHUP" ; + let signal_hup_handler signal = + if signal = Sys.sighup then ( + (* TODO: Not sure if set_file is async-signal-safe. + Maybe implement a better solution if it causes issues *) + Tezt_core.Log.set_file logfile ; + Log.report "Logfile was reopened") + in + Sys.set_signal Sys.sighup (Sys.Signal_handle signal_hup_handler)) ; match mode with | `Local_orchestrator_local_agents | `Ssh_host _ -> Lwt.return_unit | `Remote_orchestrator_local_agents -> -- GitLab From 5485f35f619a126744c9e31f5f0985a1636e43cf Mon Sep 17 00:00:00 2001 From: Guillaume Bau Date: Tue, 22 Jul 2025 21:03:18 +0200 Subject: [PATCH 2/4] Tezt/Cloud: change logging position --- tezt/lib_cloud/env.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tezt/lib_cloud/env.ml b/tezt/lib_cloud/env.ml index aeb581eec87a..c529df1dd7ac 100644 --- a/tezt/lib_cloud/env.ml +++ b/tezt/lib_cloud/env.ml @@ -119,7 +119,6 @@ let init () = (match Tezt_core.Cli.Logs.file with | None -> () | Some logfile -> - Log.report "Installing signal handler for SIGHUP" ; let signal_hup_handler signal = if signal = Sys.sighup then ( (* TODO: Not sure if set_file is async-signal-safe. @@ -127,6 +126,7 @@ let init () = Tezt_core.Log.set_file logfile ; Log.report "Logfile was reopened") in + Log.report "Installing signal handler for reopening logs" ; Sys.set_signal Sys.sighup (Sys.Signal_handle signal_hup_handler)) ; match mode with | `Local_orchestrator_local_agents | `Ssh_host _ -> Lwt.return_unit -- GitLab From 1ca4d20984a7602a1614d8df3bcf8e1f302297fa Mon Sep 17 00:00:00 2001 From: Guillaume Bau Date: Tue, 22 Jul 2025 21:07:26 +0200 Subject: [PATCH 3/4] Tezt/Cloud: do not reopen logfile in signal handler --- tezt/lib_cloud/env.ml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tezt/lib_cloud/env.ml b/tezt/lib_cloud/env.ml index c529df1dd7ac..587ef4775625 100644 --- a/tezt/lib_cloud/env.ml +++ b/tezt/lib_cloud/env.ml @@ -119,12 +119,26 @@ let init () = (match Tezt_core.Cli.Logs.file with | None -> () | Some logfile -> + let sighup_flag = ref false in + (* loop every second to check if sighup_flag was set *) + let _logfile_reopen () = + let rec loop () = + let* () = + if !sighup_flag then ( + sighup_flag := false ; + Log.report "Reopening logfile : %s" logfile ; + Tezt_core.Log.set_file logfile ; + Lwt.return_unit) + else Lwt_unix.sleep 1. + in + loop () + in + Log.report "Starting reopen logfile background handler" ; + loop () + in + (* signal handler that now just defer Log.set_file *) let signal_hup_handler signal = - if signal = Sys.sighup then ( - (* TODO: Not sure if set_file is async-signal-safe. - Maybe implement a better solution if it causes issues *) - Tezt_core.Log.set_file logfile ; - Log.report "Logfile was reopened") + if signal = Sys.sighup then sighup_flag := true in Log.report "Installing signal handler for reopening logs" ; Sys.set_signal Sys.sighup (Sys.Signal_handle signal_hup_handler)) ; -- GitLab From 5bd71f784f8d9e67acc533c544d34e1b728d22f1 Mon Sep 17 00:00:00 2001 From: Guillaume Bau Date: Tue, 22 Jul 2025 22:54:45 +0200 Subject: [PATCH 4/4] Tezt/Cloud: start logfile reopen background loop --- tezt/lib_cloud/env.ml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tezt/lib_cloud/env.ml b/tezt/lib_cloud/env.ml index 587ef4775625..70eb8a02d126 100644 --- a/tezt/lib_cloud/env.ml +++ b/tezt/lib_cloud/env.ml @@ -121,7 +121,7 @@ let init () = | Some logfile -> let sighup_flag = ref false in (* loop every second to check if sighup_flag was set *) - let _logfile_reopen () = + let logfile_reopen = let rec loop () = let* () = if !sighup_flag then ( @@ -140,7 +140,12 @@ let init () = let signal_hup_handler signal = if signal = Sys.sighup then sighup_flag := true in - Log.report "Installing signal handler for reopening logs" ; + let _ = + Lwt_main.Exit_hooks.add_first (fun () -> + let () = Lwt.cancel logfile_reopen in + Lwt.return_unit) + in + Log.report "Installing signal handler for reopening logfile" ; Sys.set_signal Sys.sighup (Sys.Signal_handle signal_hup_handler)) ; match mode with | `Local_orchestrator_local_agents | `Ssh_host _ -> Lwt.return_unit -- GitLab