From 28e3e4cdca0b98db480ce5b304006e6339146c33 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Mon, 5 Aug 2019 17:53:00 +0200 Subject: [PATCH] sourcestats: enable selection with maxsamples < 3 Setting maxsamples to 1 or 2 prevented the source from being selected as the regression would always fail. Handle this as a special case with disabled frequency tracking in order to enable a fast reference update with the -q/-Q option. --- doc/chrony.conf.adoc | 4 ++++ sourcestats.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/doc/chrony.conf.adoc b/doc/chrony.conf.adoc index e1fbef3..cf94689 100644 --- a/doc/chrony.conf.adoc +++ b/doc/chrony.conf.adoc @@ -655,6 +655,10 @@ The *maxsamples* directive sets the default maximum number of samples that individual sources in the <> and <> directives. The default value is 0, which disables the configurable limit. The useful range is 4 to 64. ++ +As a special case, setting *maxsamples* to 1 disables frequency tracking in +order to make the sources immediately selectable with only one sample. This can +be useful when *chronyd* is started with the *-q* or *-Q* option. [[minsamples]]*minsamples* _samples_:: The *minsamples* directive sets the default minimum number of samples that diff --git a/sourcestats.c b/sourcestats.c index a3f3c5f..508a5fd 100644 --- a/sourcestats.c +++ b/sourcestats.c @@ -708,6 +708,13 @@ SST_GetSelectionData(SST_Stats inst, struct timespec *now, *select_ok = inst->regression_ok; + /* If maxsamples is too small to have a successful regression, enable the + selection as a special case for a fast update/print-once reference mode */ + if (!*select_ok && inst->n_samples < 3 && inst->n_samples == inst->max_samples) { + *std_dev = CNF_GetMaxJitter(); + *select_ok = 1; + } + DEBUG_LOG("n=%d off=%f dist=%f sd=%f first_ago=%f last_ago=%f selok=%d", inst->n_samples, offset, *root_distance, *std_dev, *first_sample_ago, *last_sample_ago, *select_ok);