From d553101616264492adebd0efb36264f1e5b9d363 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Wed, 24 May 2023 12:12:42 +0200 Subject: [PATCH] lib: tweak selection errors when consuming cached answer Forwarding-related changes uncovered this case in integration.iter_limits test. Errors can happen also when consuming data produced by cache, in which case there's no suitable server to blame for the error. --- lib/resolve-produce.c | 1 + lib/selection.c | 9 +++++++++ lib/selection.h | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/lib/resolve-produce.c b/lib/resolve-produce.c index 72b0709ff..d9bec4337 100644 --- a/lib/resolve-produce.c +++ b/lib/resolve-produce.c @@ -646,6 +646,7 @@ int kr_resolve_produce(struct kr_request *request, struct kr_transport **transpo ITERATE_LAYERS(request, qry, produce, packet); if (!(request->state & KR_STATE_FAIL) && knot_wire_get_qr(packet->wire)) { /* Produced an answer from cache, consume it. */ + kr_server_selection_cached(qry); qry->secret = 0; request->state = KR_STATE_CONSUME; ITERATE_LAYERS(request, qry, consume, packet); diff --git a/lib/selection.c b/lib/selection.c index c25782e62..dc3a601c6 100644 --- a/lib/selection.c +++ b/lib/selection.c @@ -772,6 +772,15 @@ void kr_server_selection_init(struct kr_query *qry) mempool, &qry->server_selection.local_state->private); } } +void kr_server_selection_cached(struct kr_query *qry) +{ + qry->server_selection = (struct kr_server_selection){ + .initialized = false, + // we reuse iter_error, as it's no-op if (!initialized) + .error = iter_error, + // everything else is NULL + }; +} int kr_forward_add_target(struct kr_request *req, const struct sockaddr *sock) { diff --git a/lib/selection.h b/lib/selection.h index 34cc69c4d..0938e3804 100644 --- a/lib/selection.h +++ b/lib/selection.h @@ -131,6 +131,12 @@ struct kr_server_selection { */ KR_EXPORT void kr_server_selection_init(struct kr_query *qry); +/** + * @brief Ensure server selection state suitable for processing "reply from cache". + * + * In particular, qry->server_selection.error() calls shouldn't crash. + */ +void kr_server_selection_cached(struct kr_query *qry); /** * @brief Add forwarding target to request. -- 2.47.2