From 082af24114a96bd8363bc61c9f0f3a5b9f490be4 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 20 May 2025 07:59:38 +0200 Subject: [PATCH] local+reference: fix tracking offset after failed step If a clock step enabled by the makestep directive or requested by the makestep command fails, accumulate the missing step back to keep the tracking offset valid. This fixes time served by an instance configured with the makestep directive and the -x option (the null driver cannot perform steps) at the same time. It will still generate error log messages. --- local.c | 5 ++++- reference.c | 2 ++ test/simulation/128-nocontrol | 20 +++++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/local.c b/local.c index 7855594..059d8c0 100644 --- a/local.c +++ b/local.c @@ -695,8 +695,11 @@ LCL_MakeStep(void) /* Cancel remaining slew and make the step */ LCL_AccumulateOffset(correction, 0.0); - if (!LCL_ApplyStepOffset(-correction)) + if (!LCL_ApplyStepOffset(-correction)) { + /* Revert the correction */ + LCL_AccumulateOffset(-correction, 0.0); return 0; + } LOG(LOGS_WARN, "System clock was stepped by %.6f seconds", correction); diff --git a/reference.c b/reference.c index e7dc116..960e011 100644 --- a/reference.c +++ b/reference.c @@ -991,6 +991,8 @@ REF_SetReference(int stratum, NTP_Leap leap, int combined_sources, if (step_offset != 0.0) { if (LCL_ApplyStepOffset(step_offset)) LOG(LOGS_WARN, "System clock was stepped by %.6f seconds", -step_offset); + else + LCL_AccumulateOffset(step_offset, 0.0); } update_leap_status(leap, raw_now.tv_sec, 0); diff --git a/test/simulation/128-nocontrol b/test/simulation/128-nocontrol index 3f0d18d..31a441b 100755 --- a/test/simulation/128-nocontrol +++ b/test/simulation/128-nocontrol @@ -22,6 +22,24 @@ check_chronyd_exit || test_fail check_source_selection || test_fail check_packet_interval || test_fail check_sync || test_fail -check_chronyc_output "^.*Stratum *: 2.*$" || test_fail +check_chronyc_output "^.*Stratum *: 2 +Ref time.* +System time *: 0.000.* +Last offset *: [+-]0.000.*$" || test_fail +check_log_messages "Could not step" 0 0 || test_fail + +client_conf="makestep 0.01 -1" +client_server_options="offset 5.0005" + +run_test || test_fail +check_chronyd_exit || test_fail +check_source_selection || test_fail +check_packet_interval || test_fail +check_sync || test_fail +check_chronyc_output "^.*Stratum *: 2 +Ref time.* +System time *: 5.000.* +Last offset *: [+-]0.000.*$" || test_fail +check_log_messages "Could not step" 20 60 || test_fail test_pass