From 4c29f8888c767b4438b62c55ece1ae36e85daea9 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Mon, 14 Feb 2022 10:55:22 +0100 Subject: [PATCH] sources: handle unsynchronized sources in selection Allow sources to accumulate samples with the leap status set to not synchronized. Define a new state for them to be ignored in the selection. This is intended for sources that are never synchronized and will be used only for stabilization. --- client.c | 12 ++++++------ doc/chronyc.adoc | 1 + sources.c | 9 +++++++++ test/unit/sources.c | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/client.c b/client.c index f878fd1..a2c780f 100644 --- a/client.c +++ b/client.c @@ -2399,12 +2399,12 @@ process_cmd_selectdata(char *line) n_sources = ntohl(reply.data.n_sources.n_sources); if (verbose) { - printf( " .-- State: N - noselect, M - missing samples, d/D - large distance,\n"); - printf( " / ~ - jittery, w/W - waits for others, T - not trusted,\n"); - printf( "| x - falseticker, P - not preferred, U - waits for update,\n"); - printf( "| S - stale, O - orphan, + - combined, * - best.\n"); - printf( "| Effective options ------. (N - noselect, P - prefer\n"); - printf( "| Configured options -. \\ T - trust, R - require)\n"); + printf( " . State: N - noselect, s - unsynchronised, M - missing samples,\n"); + printf( " / d/D - large distance, ~ - jittery, w/W - waits for others,\n"); + printf( "| S - stale, O - orphan, T - not trusted, P - not preferred,\n"); + printf( "| U - waits for update,, x - falseticker, + - combined, * - best.\n"); + printf( "| Effective options ---------. (N - noselect, P - prefer\n"); + printf( "| Configured options ----. \\ T - trust, R - require)\n"); printf( "| Auth. enabled (Y/N) -. \\ \\ Offset interval --.\n"); printf( "| | | | |\n"); } diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc index cfb5eb8..adbf1da 100644 --- a/doc/chronyc.adoc +++ b/doc/chronyc.adoc @@ -448,6 +448,7 @@ states are reported. The following states indicate the source is not considered selectable for synchronisation: * _N_ - has the *noselect* option. +* _s_ - is not synchronised. * _M_ - does not have enough measurements. * _d_ - has a root distance larger than the maximum distance (configured by the <> directive). diff --git a/sources.c b/sources.c index c439a74..f158952 100644 --- a/sources.c +++ b/sources.c @@ -68,6 +68,7 @@ struct SelectInfo { typedef enum { SRC_OK, /* OK so far, not a final status! */ SRC_UNSELECTABLE, /* Has noselect option set */ + SRC_UNSYNCHRONISED, /* Provides samples but not unsynchronised */ SRC_BAD_STATS, /* Doesn't have valid stats data */ SRC_BAD_DISTANCE, /* Has root distance longer than allowed maximum */ SRC_JITTERY, /* Had std dev larger than allowed maximum */ @@ -815,6 +816,12 @@ SRC_SelectSource(SRC_Instance updated_inst) continue; } + /* Ignore sources which are not synchronised */ + if (sources[i]->leap == LEAP_Unsynchronised) { + mark_source(sources[i], SRC_UNSYNCHRONISED); + continue; + } + si = &sources[i]->sel_info; SST_GetSelectionData(sources[i]->stats, &now, &si->lo_limit, &si->hi_limit, &si->root_distance, @@ -1642,6 +1649,8 @@ get_status_char(SRC_Status status) switch (status) { case SRC_UNSELECTABLE: return 'N'; + case SRC_UNSYNCHRONISED: + return 's'; case SRC_BAD_STATS: return 'M'; case SRC_BAD_DISTANCE: diff --git a/test/unit/sources.c b/test/unit/sources.c index 6d85b82..584c123 100644 --- a/test/unit/sources.c +++ b/test/unit/sources.c @@ -101,6 +101,8 @@ test_unit(void) TEST_CHECK(sources[l]->status > SRC_OK && sources[l]->status <= SRC_SELECTED); if (sources[l]->sel_options & SRC_SELECT_NOSELECT) { TEST_CHECK(sources[l]->status == SRC_UNSELECTABLE); + } else if (sources[l]->leap == LEAP_Unsynchronised) { + TEST_CHECK(sources[l]->status == SRC_UNSYNCHRONISED); } else if (sources[l]->status != SRC_BAD_DISTANCE) { if (sources[l]->status >= SRC_NONPREFERRED) { passed++;