The main change here is that I merged a postgres refactor into the main branch as I’m updating the beta site with that (and the production site soon I hope). The ntppool-agent should work with either. The list below is a Claude summary of the CHANGES file.
The current version in the production repository is 4.1.6 (since earlier today) which was primarily just a rebuild with updated Go and dependencies (from the agent perspective) and the current beta version is 4.2.0 (some features around “implausible RTTs” that a single since long deleted server exhibited a while ago).
v4.2.0
Upgrading the agent needs no other change. It works with both the old MySQL server and the new PostgreSQL server.
Client
- Fix: The agent reports a sample with a zero or negative round trip time as an error (“implausible rtt”). Before, it treated that sample as a fast, healthy response. The best sample is the one with the lowest rtt, so a bogus zero beat good samples. Now the agent prefers the other samples for that NTP server. If every sample is bad, it reports the server as an error. On the local clock check, a reference server that fails this way counts as a failure.
- Fix: An empty configuration response from the API is now an error. Before, it crashed the agent with a nil pointer dereference.
- Fix: An ad-hoc NTP check from the web interface no longer changes the sample count of the agent’s regular checks.
Server
- A zero or negative round trip time now counts against the monitored NTP server. Such a response means the server reported spending longer on the request than the whole exchange took.
monitor-apiscores it as an error (“implausible rtt”: step -4, no offset), drops the rtt, and logs a warning with the server and the rtt. Before,monitor-apiscored the response on its offset. - Timeouts no longer count as a 0 ms round trip in the average that ranks monitors for an NTP server. Monitors that see timeouts rank lower than before.
v4.1.6
Server
- Promotion from testing to active no longer blocks silently. The selector now derives the minimum sample counts for testing → active and candidate → testing promotions from
interval_testing. Withinterval_testingabove about 45 minutes, the old fixed threshold was unreachable, so no monitor could move from testing to active. The defaultinterval_testingis now 30 minutes (was 45). - Fix: The scorer no longer crashes and replays the same entry forever when an NTP server has no recent monitor data, for example when every probe times out. It now skips those entries and counts them in
scorer_score_errors_skipped_total. Before, the scorer never moved past that entry. - Fix: Result submissions no longer queue behind the scorer. The scorer used to hold row locks on
serversfor a whole batch. It now updatesserversafter the batch commits. - Fix:
SubmitResultsis back to 1 transaction per status. The single transaction that v4.1.5 added caused transaction deadlocks.
Packaging
- Fix: The postinstall script skips
systemctlcalls when systemd isn’t PID 1. The check in v4.1.2 ransystemctl --version, which succeeds in any container that hassystemctlinstalled. The script now checks for/run/systemd/system.
v4.1.5
Client
- RPC timeouts are longer: 30s for the response header and 60s overall (was 10s and 30s).
SubmitResultscan now wait out database contention on the server. - Batch error logs carry the matching
trace_id, and failed batches show up as errored spans.
v4.1.4
Client
- Better systemd journal support, from an upgrade of
go.ntppool.org/commonto v0.10.2.
v4.1.3
Client
- When stderr connects to journald, the agent sends each log record through the native journal protocol with its own priority.
journalctl -pandLogLevelMax=in the unit file now filter by severity.DEBUG_INVOCATION(set byRestartMode=debug) raises stderr verbosity to debug after a failed restart. - On an MQTT session takeover (reason code
0x8E), the agent backs off its reconnects: 2m, then 5m, 10m and 15m. Before, it reconnected every 10s. That code means another client connected with the same client ID. - While another client holds the session, the agent pauses NTP checks and result submission. The backoff resets after 30 minutes of stable connection, and the agent now always logs the disconnect reason code.
v4.1.2
Client
- New
--log-levelflag andMONITOR_LOG_LEVELenvironment variable set the stderr log level.--debugoverrides both and sets the level to DEBUG. The server controls the OTLP log level through the gRPC config, and the agent caches it instate.json. - The agent sets
OTEL_SERVICE_NAME=ntppool-agent, so its logs appear in Loki under the correct service name.
Packaging
- The postinstall script exits cleanly on non-systemd systems and in containers where
systemctlexists but systemd isn’t PID 1. Until v4.1.6, this check wrongly passed in any container that hadsystemctlinstalled.
v4.1.1
Packaging
- On upgrade, the postinstall script disables all legacy
ntppool-monitor@*systemd units and clears their failed-unit records. The package now declares a conflict with the old package, so the replacement is clean.
v4.1.0
Packaging
- The deb, rpm and apk packages declare that they replace the old
ntppool-monitorpackage, so an upgrade removes it.