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.
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);
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)
{
*/
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.