]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
fix: lock-free counters for auth_zone up/down queries 1169/head
authorSergey Kacheev <s.kacheev@gmail.com>
Tue, 29 Oct 2024 14:21:52 +0000 (17:21 +0300)
committerSergey Kacheev <s.kacheev@gmail.com>
Tue, 19 Nov 2024 15:55:31 +0000 (18:55 +0300)
daemon/stats.c
iterator/iterator.c
services/authzone.c
services/authzone.h
services/mesh.c
services/mesh.h

index 0e17300a150e536fd883f9a860b215bb6bdc651b..1eb7d458fa299135057b539be437cdedc51954a3 100644 (file)
@@ -325,20 +325,8 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
        s->svr.num_query_dnscrypt_replay = 0;
 #endif /* USE_DNSCRYPT */
        if(worker->env.auth_zones) {
-               if(reset && !worker->env.cfg->stat_cumulative) {
-                       lock_rw_wrlock(&worker->env.auth_zones->lock);
-               } else {
-                       lock_rw_rdlock(&worker->env.auth_zones->lock);
-               }
-               s->svr.num_query_authzone_up = (long long)worker->env.
-                       auth_zones->num_query_up;
-               s->svr.num_query_authzone_down = (long long)worker->env.
-                       auth_zones->num_query_down;
-               if(reset && !worker->env.cfg->stat_cumulative) {
-                       worker->env.auth_zones->num_query_up = 0;
-                       worker->env.auth_zones->num_query_down = 0;
-               }
-               lock_rw_unlock(&worker->env.auth_zones->lock);
+               s->svr.num_query_authzone_up += (long long)worker->env.mesh->num_query_authzone_up;
+               s->svr.num_query_authzone_down += (long long)worker->env.mesh->num_query_authzone_down;
        }
        s->svr.mem_stream_wait =
                (long long)tcp_req_info_get_stream_buffer_size();
@@ -454,6 +442,8 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
        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.num_query_authzone_up += a->svr.num_query_authzone_up;
+       total->svr.num_query_authzone_down += a->svr.num_query_authzone_down;
        if (total->svr.max_query_time_us < a->svr.max_query_time_us)
                total->svr.max_query_time_us = a->svr.max_query_time_us;
        total->svr.sum_query_list_size += a->svr.sum_query_list_size;
index 59e4b36ce364abca9502d9ad2af8616acc839466..a2119d89bc11beb5e6c3d5a6462fd5ca4a51ff40 100644 (file)
@@ -2741,9 +2741,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                if((iq->chase_flags&BIT_RD) && !(iq->response->rep->flags&BIT_AA)) {
                        verbose(VERB_ALGO, "forwarder, ignoring referral from auth zone");
                } else {
-                       lock_rw_wrlock(&qstate->env->auth_zones->lock);
-                       qstate->env->auth_zones->num_query_up++;
-                       lock_rw_unlock(&qstate->env->auth_zones->lock);
+                       qstate->env->mesh->num_query_authzone_up++;
                        iq->num_current_queries++;
                        iq->chase_to_rd = 0;
                        iq->dnssec_lame_query = 0;
index 6f6c55d4397dedbc6d1ccb8c916275d62a88945b..8019c491f1ad51e91deb67af425c12854eee0ed8 100644 (file)
@@ -3610,9 +3610,7 @@ int auth_zones_answer(struct auth_zones* az, struct module_env* env,
                        return 0;
                }
                lock_rw_unlock(&z->lock);
-               lock_rw_wrlock(&az->lock);
-               az->num_query_down++;
-               lock_rw_unlock(&az->lock);
+               env->mesh->num_query_authzone_down++;
                auth_error_encode(qinfo, env, edns, repinfo, buf, temp,
                        LDNS_RCODE_SERVFAIL);
                return 1;
@@ -3625,9 +3623,7 @@ int auth_zones_answer(struct auth_zones* az, struct module_env* env,
                /* fallback to regular answering (recursive) */
                return 0;
        }
-       lock_rw_wrlock(&az->lock);
-       az->num_query_down++;
-       lock_rw_unlock(&az->lock);
+       env->mesh->num_query_authzone_down++;
 
        /* encode answer */
        if(!r)
index 07614ed82963d33b37891b20a781db318be2843a..3994a4eadb313c5f0b1315092cf3303d687b6d06 100644 (file)
@@ -78,10 +78,6 @@ struct auth_zones {
        rbtree_type xtree;
        /** do we have downstream enabled */
        int have_downstream;
-       /** number of queries upstream */
-       size_t num_query_up;
-       /** number of queries downstream */
-       size_t num_query_down;
        /** first auth zone containing rpz item in linked list */
        struct auth_zone* rpz_first;
        /** rw lock for rpz linked list, needed when iterating or editing linked
index d512ab3d32d4d7d22fabf2a0169d79ccc5f10838..cf9280590eef665990bc26a9cdac3c8aaf25c3c2 100644 (file)
@@ -2029,6 +2029,8 @@ mesh_stats_clear(struct mesh_area* mesh)
 {
        if(!mesh)
                return;
+       mesh->num_query_authzone_up = 0;
+       mesh->num_query_authzone_down = 0;
        mesh->replies_sent = 0;
        mesh->replies_sum_wait.tv_sec = 0;
        mesh->replies_sum_wait.tv_usec = 0;
index 26ececbe62105c42c8914b39592e3731d2c39bc4..9dcf6ab319648a94ffb531242c93f5a1d0f78f37 100644 (file)
@@ -90,6 +90,11 @@ struct mesh_area {
        /** rbtree of all current queries (mesh_state.node)*/
        rbtree_type all;
 
+       /** number of queries for unbound's auth_zones, upstream query */
+       size_t num_query_authzone_up;
+       /** number of queries for unbound's auth_zones, downstream answers */
+       size_t num_query_authzone_down;
+
        /** count of the total number of mesh_reply entries */
        size_t num_reply_addrs;
        /** count of the number of mesh_states that have mesh_replies