From: Miroslav Lichvar Date: Tue, 20 May 2025 05:59:38 +0000 (+0200) Subject: local+reference: fix tracking offset after failed step X-Git-Tag: 4.7-pre1~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=082af24114a96bd8363bc61c9f0f3a5b9f490be4;p=thirdparty%2Fchrony.git 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. --- diff --git a/local.c b/local.c index 78555947..059d8c02 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 e7dc116b..960e011c 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 3f0d18df..31a441b8 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