(unsigned long)s->svr.num_queries_missed_cache)) return 0;
if(!ssl_printf(ssl, "%s.num.prefetch"SQ"%lu\n", nm,
(unsigned long)s->svr.num_queries_prefetch)) return 0;
+ if(!ssl_printf(ssl, "%s.num.queries_timed_out"SQ"%lu\n", nm,
+ (unsigned long)s->svr.num_queries_timed_out)) return 0;
if(!ssl_printf(ssl, "%s.num.expired"SQ"%lu\n", nm,
(unsigned long)s->svr.ans_expired)) return 0;
if(!ssl_printf(ssl, "%s.num.recursivereplies"SQ"%lu\n", nm,
total->svr.num_queries_ip_ratelimited += a->svr.num_queries_ip_ratelimited;
total->svr.num_queries_missed_cache += a->svr.num_queries_missed_cache;
total->svr.num_queries_prefetch += a->svr.num_queries_prefetch;
+ total->svr.num_queries_timed_out += a->svr.num_queries_timed_out;
total->svr.sum_query_list_size += a->svr.sum_query_list_size;
total->svr.ans_expired += a->svr.ans_expired;
#ifdef USE_DNSCRYPT
verbose(VERB_ALGO, "handle request called with err=%d", error);
return 0;
}
+
+ if (worker->env.cfg->sock_queue_timeout && timeval_isset(c->recv_tv)) {
+ c->recv_tv.tv_sec += worker->env.cfg->sock_queue_timeout;
+ if (timeval_smaller(c->recv_tv, worker->env.now_tv)) {
+ /* count and drop queries that were sitting in the socket queue too long */
+ worker->stats.num_queries_timed_out++;
+ return 0;
+ }
+ }
+
#ifdef USE_DNSCRYPT
repinfo->max_udp_size = worker->daemon->cfg->max_udp_size;
if(!dnsc_handle_curved_request(worker->daemon->dnscenv, repinfo)) {
long long num_queries_missed_cache;
/** number of prefetch queries - cachehits with prefetch */
long long num_queries_prefetch;
+ /** number of queries which are too late to process */
+ long long num_queries_timed_out;
/**
* Sum of the querylistsize of the worker for
s->svr.num_queries - s->svr.num_queries_missed_cache);
PR_UL_NM("num.cachemiss", s->svr.num_queries_missed_cache);
PR_UL_NM("num.prefetch", s->svr.num_queries_prefetch);
+ PR_UL_NM("num.queries_timed_out", s->svr.num_queries_timed_out);
PR_UL_NM("num.expired", s->svr.ans_expired);
PR_UL_NM("num.recursivereplies", s->mesh_replies_sent);
#ifdef USE_DNSCRYPT