A refclock in the local mode is locked to itself. When the maxlockage
check failed after missing some samples, it failed permanently and the
refclock was not able to accumulate any new samples.
When the check fails, drop all samples and reset the source to start
from scratch.
Reported-by: Dan Drown <dan-ntp@drown.org>
sample_diff = UTI_DiffTimespecsToDouble(cooked_time, &ref_sample.time);
if (fabs(sample_diff) >= (double)instance->max_lock_age / rate) {
- DEBUG_LOG("refclock pulse ignored samplediff=%.9f",
- sample_diff);
+ DEBUG_LOG("refclock pulse ignored samplediff=%.9f", sample_diff);
+
+ /* Restart the local mode */
+ if (instance->local) {
+ LOG(LOGS_WARN, "Local refclock lost lock");
+ SPF_DropSamples(instance->filter);
+ SRC_ResetInstance(instance->source);
+ }
return 0;
}