From: Nick Porter Date: Fri, 7 Mar 2025 10:42:05 +0000 (+0000) Subject: Split rlm_stats into two method calls X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=709e4dfae783be33b66817ca3fd577c8e6ca3ddb;p=thirdparty%2Ffreeradius-server.git Split rlm_stats into two method calls To distinguish incrementing and fetching. --- diff --git a/src/modules/rlm_stats/rlm_stats.c b/src/modules/rlm_stats/rlm_stats.c index 4c28094fcf..a2f2435aed 100644 --- a/src/modules/rlm_stats/rlm_stats.c +++ b/src/modules/rlm_stats/rlm_stats.c @@ -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 } }