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.
This commit is contained in:
Miroslav Lichvar
2025-05-20 07:59:38 +02:00
parent 577221295f
commit 082af24114
3 changed files with 25 additions and 2 deletions

View File

@@ -695,8 +695,11 @@ LCL_MakeStep(void)
/* Cancel remaining slew and make the step */ /* Cancel remaining slew and make the step */
LCL_AccumulateOffset(correction, 0.0); LCL_AccumulateOffset(correction, 0.0);
if (!LCL_ApplyStepOffset(-correction)) if (!LCL_ApplyStepOffset(-correction)) {
/* Revert the correction */
LCL_AccumulateOffset(-correction, 0.0);
return 0; return 0;
}
LOG(LOGS_WARN, "System clock was stepped by %.6f seconds", correction); LOG(LOGS_WARN, "System clock was stepped by %.6f seconds", correction);

View File

@@ -991,6 +991,8 @@ REF_SetReference(int stratum, NTP_Leap leap, int combined_sources,
if (step_offset != 0.0) { if (step_offset != 0.0) {
if (LCL_ApplyStepOffset(step_offset)) if (LCL_ApplyStepOffset(step_offset))
LOG(LOGS_WARN, "System clock was stepped by %.6f seconds", -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); update_leap_status(leap, raw_now.tv_sec, 0);

View File

@@ -22,6 +22,24 @@ check_chronyd_exit || test_fail
check_source_selection || test_fail check_source_selection || test_fail
check_packet_interval || test_fail check_packet_interval || test_fail
check_sync || 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 test_pass