]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Split rlm_stats into two method calls
authorNick Porter <nick@portercomputing.co.uk>
Fri, 7 Mar 2025 10:42:05 +0000 (10:42 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Fri, 7 Mar 2025 12:05:41 +0000 (12:05 +0000)
To distinguish incrementing and fetching.

src/modules/rlm_stats/rlm_stats.c

index 4c28094fcf90c1f6056fcc1b0213c9a74a3be38d..a2f2435aedc089a97f0ee443a5e5b5b97f2da893 100644 (file)
@@ -163,101 +163,96 @@ static void coalesce(uint64_t final_stats[FR_RADIUS_CODE_MAX], rlm_stats_thread_
 }
 
 
-/*
- *     Do the statistics
- */
-static unlang_action_t CC_HINT(nonnull) mod_stats(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+static unlang_action_t CC_HINT(nonnull) mod_stats_inc(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
 {
        rlm_stats_t             *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
        rlm_stats_thread_t      *t = talloc_get_type_abort(mctx->thread, rlm_stats_thread_t);
-       int                     i;
-       uint32_t                stats_type;
+       int                     i, src_code, dst_code;
+       rlm_stats_data_t        *stats;
+       rlm_stats_data_t        mydata;
 
+       src_code = request->packet->code;
+       if (src_code >= FR_RADIUS_CODE_MAX) src_code = 0;
 
-       fr_pair_t *vp;
-       rlm_stats_data_t mydata;
-       char buffer[64];
-       uint64_t local_stats[NUM_ELEMENTS(inst->mutable->stats)];
+       dst_code = request->reply->code;
+       if (dst_code >= FR_RADIUS_CODE_MAX) dst_code = 0;
+
+       pthread_mutex_lock(&t->mutex);
+       t->stats[src_code]++;
+       t->stats[dst_code]++;
 
        /*
-        *      Increment counters only in "send foo" sections.
-        *
-        *      i.e. only when we have a reply to send.
-        *
-        *      FIXME - Nothing sets request_state anymore
+        *      Update source statistics
         */
-#if 0
-       if (request->request_state == REQUEST_SEND) {
-               int src_code, dst_code;
-               rlm_stats_data_t *stats;
+       mydata.ipaddr = request->packet->socket.inet.src_ipaddr;
+       stats = fr_rb_find(t->src, &mydata);
+       if (!stats) {
+               MEM(stats = talloc_zero(t, rlm_stats_data_t));
 
-               src_code = request->packet->code;
-               if (src_code >= FR_RADIUS_CODE_MAX) src_code = 0;
+               stats->ipaddr = request->packet->socket.inet.src_ipaddr;
+               stats->created = request->async->recv_time;
 
-               dst_code = request->reply->code;
-               if (dst_code >= FR_RADIUS_CODE_MAX) dst_code = 0;
+               (void) fr_rb_insert(t->src, stats);
+       }
 
-               pthread_mutex_lock(&t->mutex);
-               t->stats[src_code]++;
-               t->stats[dst_code]++;
+       stats->last_packet = request->async->recv_time;
+       stats->stats[src_code]++;
+       stats->stats[dst_code]++;
 
-               /*
-                *      Update source statistics
-                */
-               mydata.ipaddr = request->packet->socket.inet.src_ipaddr;
-               stats = fr_rb_find(t->src, &mydata);
-               if (!stats) {
-                       MEM(stats = talloc_zero(t, rlm_stats_data_t));
+       /*
+        *      Update destination statistics
+        */
+       mydata.ipaddr = request->packet->socket.inet.dst_ipaddr;
+       stats = fr_rb_find(t->dst, &mydata);
+       if (!stats) {
+               MEM(stats = talloc_zero(t, rlm_stats_data_t));
 
-                       stats->ipaddr = request->packet->socket.inet.src_ipaddr;
-                       stats->created = request->async->recv_time;
+               stats->ipaddr = request->packet->socket.inet.dst_ipaddr;
+               stats->created = request->async->recv_time;
 
-                       (void) fr_rb_insert(t->src, stats);
-               }
-
-               stats->last_packet = request->async->recv_time;
-               stats->stats[src_code]++;
-               stats->stats[dst_code]++;
+               (void) fr_rb_insert(t->dst, stats);
+       }
 
-               /*
-                *      Update destination statistics
-                */
-               mydata.ipaddr = request->packet->socket.inet.dst_ipaddr;
-               stats = fr_rb_find(t->dst, &mydata);
-               if (!stats) {
-                       MEM(stats = talloc_zero(t, rlm_stats_data_t));
+       stats->last_packet = request->async->recv_time;
+       stats->stats[src_code]++;
+       stats->stats[dst_code]++;
+       pthread_mutex_unlock(&t->mutex);
 
-                       stats->ipaddr = request->packet->socket.inet.dst_ipaddr;
-                       stats->created = request->async->recv_time;
+       /*
+        *      @todo - periodically clean up old entries.
+        */
 
-                       (void) fr_rb_insert(t->dst, stats);
-               }
+       if (fr_time_gt(fr_time_add(t->last_global_update, fr_time_delta_wrap(NSEC)), request->async->recv_time)) {
+               RETURN_MODULE_UPDATED;
+       }
 
-               stats->last_packet = request->async->recv_time;
-               stats->stats[src_code]++;
-               stats->stats[dst_code]++;
-               pthread_mutex_unlock(&t->mutex);
+       t->last_global_update = request->async->recv_time;
 
-               /*
-                *      @todo - periodically clean up old entries.
-                */
+       pthread_mutex_lock(&inst->mutable->mutex);
+       for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
+               inst->mutable->stats[i] += t->stats[i];
+               t->stats[i] = 0;
+       }
+       pthread_mutex_unlock(&inst->mutable->mutex);
 
-               if ((t->last_global_update + NSEC) > request->async->recv_time) {
-                       RETURN_MODULE_UPDATED;
-               }
+       RETURN_MODULE_UPDATED;
+}
 
-               t->last_global_update = request->async->recv_time;
+/*
+ *     Do the statistics
+ */
+static unlang_action_t CC_HINT(nonnull) mod_stats_read(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+{
+       rlm_stats_t             *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
+       rlm_stats_thread_t      *t = talloc_get_type_abort(mctx->thread, rlm_stats_thread_t);
+       int                     i;
+       uint32_t                stats_type;
 
-               pthread_mutex_lock(&inst->mutable->mutex);
-               for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
-                       inst->mutable->stats[i] += t->stats[i];
-                       t->stats[i] = 0;
-               }
-               pthread_mutex_unlock(&inst->mutable->mutex);
 
-               RETURN_MODULE_UPDATED;
-       }
-#endif
+       fr_pair_t *vp;
+       rlm_stats_data_t mydata;
+       char buffer[64];
+       uint64_t local_stats[NUM_ELEMENTS(inst->mutable->stats)];
 
        /*
         *      Ignore "authenticate" and anything other than Status-Server
@@ -460,7 +455,8 @@ module_rlm_t rlm_stats = {
        },
        .method_group = {
                .bindings = (module_method_binding_t[]){
-                       { .section = SECTION_NAME(CF_IDENT_ANY, CF_IDENT_ANY), .method = mod_stats },
+                       { .section = SECTION_NAME("send", CF_IDENT_ANY), .method = mod_stats_inc },
+                       { .section = SECTION_NAME("recv", "Status-Server"), .method = mod_stats_read },
                        MODULE_BINDING_TERMINATOR
                }
        }