refclock: warn if maxlockage is too small

Log a warning message if the interval covered by the maxlockage at the
PPS rate of a refclock is shorter than driver poll of the locked
refclock.

Reported-by: Matt Corallo <ntp-lists@mattcorallo.com>
This commit is contained in:
Miroslav Lichvar 2021-02-25 16:51:23 +01:00
parent dc22df93f5
commit 62f2d5736d

View file

@ -267,7 +267,7 @@ RCL_AddRefclock(RefclockParameters *params)
void void
RCL_StartRefclocks(void) RCL_StartRefclocks(void)
{ {
unsigned int i, j, n; unsigned int i, j, n, lock_index;
n = ARR_GetSize(refclocks); n = ARR_GetSize(refclocks);
@ -277,13 +277,28 @@ RCL_StartRefclocks(void)
SRC_SetActive(inst->source); SRC_SetActive(inst->source);
inst->timeout_id = SCH_AddTimeoutByDelay(0.0, poll_timeout, (void *)inst); inst->timeout_id = SCH_AddTimeoutByDelay(0.0, poll_timeout, (void *)inst);
if (inst->lock_ref) { /* Replace lock refid with the refclock's index, or -1 if not valid */
/* Replace lock refid with index to refclocks */
for (j = 0; j < n && get_refclock(j)->ref_id != inst->lock_ref; j++) lock_index = -1;
;
inst->lock_ref = j < n ? j : -1; if (inst->lock_ref != 0) {
} else for (j = 0; j < n; j++) {
inst->lock_ref = -1; RCL_Instance inst2 = get_refclock(j);
if (inst->lock_ref != inst2->ref_id)
continue;
if (inst->driver->poll && inst2->driver->poll &&
(double)inst->max_lock_age / inst->pps_rate < UTI_Log2ToDouble(inst2->driver_poll))
LOG(LOGS_WARN, "%s maxlockage too small for %s",
UTI_RefidToString(inst->ref_id), UTI_RefidToString(inst2->ref_id));
lock_index = j;
break;
}
}
inst->lock_ref = lock_index;
} }
} }