diff --git a/tezt/lib_cloud/env.ml b/tezt/lib_cloud/env.ml index faaba9e4c2d95782b32443230be70b4b67ff98a4..70eb8a02d126fbebf60528929c021f68abfc3cfc 100644 --- a/tezt/lib_cloud/env.ml +++ b/tezt/lib_cloud/env.ml @@ -116,19 +116,37 @@ 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 -> + 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 sighup_flag := true + in + 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 | `Remote_orchestrator_local_agents ->