]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
ntp: fix presend in interleaved mode
authorMiroslav Lichvar <mlichvar@redhat.com>
Tue, 21 Nov 2023 06:51:37 +0000 (07:51 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 21 Nov 2023 11:38:41 +0000 (12:38 +0100)
The presend option in interleaved mode uses two presend requests instead
of one to get an interleaved response from servers like chrony which
delay the first interleaved response due to an optimization saving
timestamps only for clients actually using the interleaved mode.

After commit 0ae6f2485b97 ("ntp: don't use first response in interleaved
mode") the first interleaved response following the two presend
responses in basic mode is dropped as the preferred set of timestamps
minimizing error in delay was already used by the second sample in
basic mode. There are only three responses in the burst and no sample is
accumulated.

Increasing the number of presend requests to three to get a fourth
sample would be wasteful. Instead, allow reusing timestamps of the
second presend sample in basic mode, which is never accumulated.

Reported-by: Aaron Thompson
Fixes: 0ae6f2485b97 ("ntp: don't use first response in interleaved mode")
ntp_core.c
test/simulation/114-presend

index 2b2b78e692c2e06178a5d7d48a930468a285962a..3b21f3625129cc82497db03e2784d91a3975d76d 100644 (file)
@@ -2302,7 +2302,7 @@ process_response(NCR_Instance inst, int saved, NTP_Local_Address *local_addr,
     inst->local_tx.net_correction = net_correction;
 
     /* Don't use the same set of timestamps for the next sample */
-    if (interleaved_packet)
+    if (interleaved_packet || inst->presend_done > 0)
       inst->prev_local_tx = inst->local_tx;
     else
       zero_local_timestamp(&inst->prev_local_tx);
index 19400ab24bc371a99e4409690648333bb880b378..3b89a7009a79e9acc69546d318662850a6681554 100755 (executable)
@@ -23,4 +23,29 @@ check_source_selection || test_fail
 check_packet_interval || test_fail
 check_sync || test_fail
 
+limit=10
+base_delay=$default_base_delay
+client_conf="logdir tmp
+log measurements"
+
+client_server_options="presend 5"
+
+run_test || test_fail
+check_chronyd_exit || test_fail
+check_packet_interval || test_fail
+
+check_file_messages "20.*123\.1.* 111 111 0111" 1 1 measurements.log || test_fail
+check_file_messages "20.*123\.1.* 111 111 1111" 1 1 measurements.log || test_fail
+rm -f tmp/measurements.log
+
+client_server_options="presend 5 xleave"
+
+run_test || test_fail
+check_chronyd_exit || test_fail
+check_packet_interval || test_fail
+
+check_file_messages "20.*123\.1.* 111 111 0111" 2 2 measurements.log || test_fail
+check_file_messages "20.*123\.1.* 111 111 1111" 1 1 measurements.log || test_fail
+rm -f tmp/measurements.log
+
 test_pass