trie_val_t *v = trie_it_val(it);
struct qr_task *task = (struct qr_task *)*v;
if ((now - worker_task_creation_time(task)) >= KR_RESOLVE_TIME_LIMIT) {
+ struct kr_request *req = worker_task_request(task);
+ if (!kr_fails_assert(req))
+ kr_query_inform_timeout(req, req->current_query);
queue_push(q, task);
worker_task_ref(task);
}
/* Close pending I/O requests */
subreq_finalize(task, packet_source, packet);
if ((kr_now() - worker_task_creation_time(task)) >= KR_RESOLVE_TIME_LIMIT) {
+ struct kr_request *req = worker_task_request(task);
+ if (!kr_fails_assert(req))
+ kr_query_inform_timeout(req, req->current_query);
return qr_task_finalize(task, KR_STATE_FAIL);
}
struct kr_rplan *rplan = &req->rplan;
struct kr_query *last = kr_rplan_last(rplan);
if (task->iter_count > KR_ITER_LIMIT) {
- VERBOSE_MSG(last, "canceling query due to exceeded iteration count limit of %d\n", KR_ITER_LIMIT);
+ char *msg = "cancelling query due to exceeded iteration count limit";
+ VERBOSE_MSG(last, "%s of %d\n", msg, KR_ITER_LIMIT);
+ kr_request_set_extended_error(req, KNOT_EDNS_EDE_OTHER, msg);
}
if (task->timeouts >= KR_TIMEOUT_LIMIT) {
- VERBOSE_MSG(last, "canceling query due to exceeded timeout retries limit of %d\n", KR_TIMEOUT_LIMIT);
+ char *msg = "cancelling query due to exceeded timeout retries limit";
+ VERBOSE_MSG(last, "%s of %d\n", msg, KR_TIMEOUT_LIMIT);
+ kr_request_set_extended_error(req, KNOT_EDNS_EDE_NREACH_AUTH, NULL);
}
return qr_task_finalize(task, KR_STATE_FAIL);
return request->answer = NULL;
}
-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) {
- VERBOSE_MSG(qry, "query resolution time limit exceeded\n");
- return true;
- }
- return false;
-}
-
int kr_resolve_consume(struct kr_request *request, struct kr_transport **transport, knot_pkt_t *packet)
{
struct kr_rplan *rplan = &request->rplan;
/* Different processing for network error */
struct kr_query *qry = array_tail(rplan->pending);
/* Check overall resolution time */
- if (resolution_time_exceeded(qry, kr_now())) {
+ if (kr_now() - qry->creation_time_mono >= KR_RESOLVE_TIME_LIMIT) {
+ kr_query_inform_timeout(request, qry);
return KR_STATE_FAIL;
}
bool tried_tcp = (qry->flags.TCP);
*/
KR_EXPORT
int kr_request_set_extended_error(struct kr_request *request, int info_code, const char *extra_text);
+
+static inline void kr_query_inform_timeout(struct kr_request *req, const struct kr_query *qry)
+{
+ kr_request_set_extended_error(req, KNOT_EDNS_EDE_NREACH_AUTH, NULL);
+
+ unsigned ind = 0;
+ for (const struct kr_query *q = qry; q; q = q->parent)
+ ind += 2;
+ const uint32_t qid = qry ? qry->uid : 0;
+
+ kr_log_req(req, qid, ind, WORKER, "internal timeout for resolving the request has expired\n");
+}