libuv's updating the stamp just once per event loop
might be too coarse, as processing multiple packets
(e.g. DNSSEC validation) may take milliseconds together.
Of course we still don't measure e.g. the time when incoming
client requests stay in OS buffers.
(cherry picked from commit
5e6a02b3902ac98b327eca281ae70fa2bb9a9598)
- tests: disable problematic config.http test (#925, !1678)
- validator: accept a confusing NODATA proof with insecure delegation (!1678)
+Bugfixes
+--------
+- stats: request latency was very incorrect in some cases (!1678)
+
Knot Resolver 5.7.4 (2024-07-23)
================================
qry->request = rplan->request;
gettimeofday(&qry->timestamp, NULL);
+ if (!parent) // start of kr_request; let's make the stamp more precise
+ uv_update_time(uv_default_loop());
qry->timestamp_mono = kr_now();
qry->creation_time_mono = parent ? parent->creation_time_mono : qry->timestamp_mono;
kr_zonecut_init(&qry->zone_cut, (const uint8_t *)"", rplan->pool);
collect_answer(data, param->answer);
/* Count cached and unresolved */
if (rplan->resolved.len > 0) {
- /* Histogram of answer latency. */
+ /* Histogram of answer latency.
+ *
+ * We update the notion of time. Once per .finish isn't that expensive.
+ * defer_* also updates this if active, but not in ideal moment for stats.
+ */
+ uv_update_time(uv_default_loop());
uint64_t elapsed = kr_now() - rplan->initial->creation_time_mono;
+
stat_const_add(data, metric_answer_sum_ms, elapsed);
if (elapsed <= 1) {
stat_const_add(data, metric_answer_1ms, 1);