]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib: added kr_rplan_last() function to get last processed query
authorMarek Vavruša <mvavrusa@cloudflare.com>
Fri, 29 Dec 2017 03:23:22 +0000 (19:23 -0800)
committerMarek Vavruša <marek@vavrusa.com>
Mon, 8 Jan 2018 20:42:32 +0000 (12:42 -0800)
The last processed query is not always resolved (if resolution fails),
so previous code returned wrong query in some messages after failure.

lib/resolve.c
lib/rplan.c
lib/rplan.h
modules/stats/stats.c

index 9c71529ad919f0ea314ceb5e5e51e2179f90deeb..6273ecfee14226f908ea8d1241d7708a9302b1b5 100644 (file)
@@ -865,7 +865,7 @@ static void update_nslist_score(struct kr_request *request, struct kr_query *qry
        }
 }
 
-bool resolution_time_exceeded(struct kr_query *qry, uint64_t now)
+static bool resolution_time_exceeded(struct kr_query *qry, uint64_t now)
 {
        uint64_t resolving_time = now - qry->creation_time_mono;
        if (resolving_time > KR_RESOLVE_TIME_LIMIT) {
@@ -1565,7 +1565,7 @@ int kr_resolve_finish(struct kr_request *request, int state)
        request->state = state;
        ITERATE_LAYERS(request, NULL, finish);
 
-       struct kr_query *last = rplan->resolved.len > 0 ? array_tail(rplan->resolved) : NULL;
+       struct kr_query *last = kr_rplan_last(rplan);
        VERBOSE_MSG(last, "finished: %d, queries: %zu, mempool: %zu B\n",
                  request->state, rplan->resolved.len, (size_t) mp_total_size(request->pool.ctx));
 
index f3cd1132586e5c905e7a138e449ee61e409ead0b..0a4f8e0992706939d1159ad423a483785e224dd7 100644 (file)
@@ -280,6 +280,15 @@ struct kr_query *kr_rplan_resolved(struct kr_rplan *rplan)
        return array_tail(rplan->resolved);
 }
 
+struct kr_query *kr_rplan_last(struct kr_rplan *rplan)
+{
+       if (!kr_rplan_empty(rplan)) {
+               return array_tail(rplan->pending);
+       }
+
+       return kr_rplan_resolved(rplan);
+}
+
 struct kr_query *kr_rplan_find_resolved(struct kr_rplan *rplan, struct kr_query *parent,
                                const knot_dname_t *name, uint16_t cls, uint16_t type)
 {
index 643661fc47ef3e32b2d1f4ca3a25368d5c48d3bf..084d7254e00f34888c445f5911070acc311689d0 100644 (file)
@@ -187,6 +187,13 @@ bool kr_rplan_satisfies(struct kr_query *closure, const knot_dname_t *name, uint
 KR_EXPORT KR_PURE
 struct kr_query *kr_rplan_resolved(struct kr_rplan *rplan);
 
+/**
+  * Return last query (either currently being solved or last resolved).
+  * This is necessary to retrieve the last query in case of resolution failures (e.g. time limit reached).
+  */
+KR_EXPORT KR_PURE
+struct kr_query *kr_rplan_last(struct kr_rplan *rplan);
+
 /** Return query predecessor. */
 KR_EXPORT KR_PURE
 struct kr_query *kr_rplan_next(struct kr_query *qry);
index f6173ad0feb962492bf88f4b3f2649ebf62ba9c1..cff04b24b00c08c16d494f85fecbed370460b3ca 100644 (file)
@@ -218,7 +218,7 @@ static int collect(kr_layer_t *ctx)
                        stat_const_add(data, metric_answer_slow, 1);
                }
                /* Observe the final query. */
-               struct kr_query *last = array_tail(rplan->resolved);
+               struct kr_query *last = kr_rplan_last(rplan);
                if (last->flags.CACHED) {
                        stat_const_add(data, metric_answer_cached, 1);
                }