]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
sources: handle unsynchronized sources in selection
authorMiroslav Lichvar <mlichvar@redhat.com>
Mon, 14 Feb 2022 09:55:22 +0000 (10:55 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 23 Feb 2022 13:42:40 +0000 (14:42 +0100)
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
doc/chronyc.adoc
sources.c
test/unit/sources.c

index f878fd1c9516bb9c9823c651af0104c2b7021bb2..a2c780fd2e759f7488c3ece08e1a69349c26d4e4 100644 (file)
--- 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");
   }
index cfb5eb86ab3d806f9fff1af0711dbac38852990c..adbf1da175a2b7a295dc5c9ce118f2343c29d51f 100644 (file)
@@ -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
         <<chrony.conf.adoc#maxdistance,*maxdistance*>> directive).
index c439a74d62c050b7a360c4b6aa916ec53d777114..f1589526d4063908c3e2c456ef01e2f378750c0a 100644 (file)
--- 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:
index 6d85b8208876473024abc5f5f773e979b9cba1f3..584c12396a6236dbef86f4df82c5b9d9dca08776 100644 (file)
@@ -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++;