]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: spoe: switch the timeval-based timestamps to nanosecond timestamps
authorWilly Tarreau <w@1wt.eu>
Thu, 27 Apr 2023 09:54:11 +0000 (11:54 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 28 Apr 2023 14:08:08 +0000 (16:08 +0200)
Various points were collected during a request/response and were stored
using timeval. Let's now switch them to nanosecond based timestamps.

include/haproxy/spoe-t.h
src/flt_spoe.c

index 57b8eacd2126c5989a5cf633d727bf5defe50c87..6d68841ae2965c69f273b7c77b9cccadbe571d2c 100644 (file)
@@ -366,11 +366,11 @@ struct spoe_context {
        } frag_ctx; /* Info about fragmented frames, valid on if SPOE_CTX_FL_FRAGMENTED is set */
 
        struct {
-               struct timeval tv_start;    /* start date of the current event/group */
-               struct timeval tv_request;  /* date the frame processing starts (reset for each frag) */
-               struct timeval tv_queue;    /* date the frame is queued (reset for each frag) */
-               struct timeval tv_wait;     /* date the stream starts waiting for a response */
-               struct timeval tv_response; /* date the response processing starts */
+               ullong         start_ts;    /* start date of the current event/group */
+               ullong         request_ts;  /* date the frame processing starts (reset for each frag) */
+               ullong         queue_ts;    /* date the frame is queued (reset for each frag) */
+               ullong         wait_ts;     /* date the stream starts waiting for a response */
+               ullong         response_ts; /* date the response processing starts */
                long           t_request;   /* delay to encode and push the frame in queue (cumulative for frags) */
                long           t_queue;     /* delay before the frame gets out the sending queue (cumulative for frags) */
                long           t_waiting;   /* delay before the response is reveived */
index 2c43e12c57a547b903326b6e93e5ff069d325b51..71c10a93a98ccef2a855afed80be9644aa62e0d7 100644 (file)
@@ -259,15 +259,15 @@ generate_pseudo_uuid()
        return my_strndup(trash.area, trash.data);
 }
 
-
+/* set/add to <t> the elapsed time since <since> and now */
 static inline void
-spoe_update_stat_time(struct timeval *tv, long *t)
+spoe_update_stat_time(ullong *since, long *t)
 {
        if (*t == -1)
-               *t = ns_to_ms(tv_to_ns(&now) - tv_to_ns(tv));
+               *t = ns_to_ms(tv_to_ns(&now) - *since);
        else
-               *t += ns_to_ms(tv_to_ns(&now) - tv_to_ns(tv));
-       tv_zero(tv);
+               *t += ns_to_ms(tv_to_ns(&now) - *since);
+       *since = 0;
 }
 
 /********************************************************************
@@ -1310,7 +1310,7 @@ spoe_release_appctx(struct appctx *appctx)
                LIST_DELETE(&ctx->list);
                LIST_INIT(&ctx->list);
                _HA_ATOMIC_DEC(&agent->counters.nb_waiting);
-               spoe_update_stat_time(&ctx->stats.tv_wait, &ctx->stats.t_waiting);
+               spoe_update_stat_time(&ctx->stats.wait_ts, &ctx->stats.t_waiting);
                ctx->spoe_appctx = NULL;
                ctx->state = SPOE_CTX_ST_ERROR;
                ctx->status_code = (spoe_appctx->status_code + 0x100);
@@ -1362,7 +1362,7 @@ spoe_release_appctx(struct appctx *appctx)
                        LIST_DELETE(&ctx->list);
                        LIST_INIT(&ctx->list);
                        _HA_ATOMIC_DEC(&agent->counters.nb_sending);
-                       spoe_update_stat_time(&ctx->stats.tv_queue, &ctx->stats.t_queue);
+                       spoe_update_stat_time(&ctx->stats.queue_ts, &ctx->stats.t_queue);
                        ctx->spoe_appctx = NULL;
                        ctx->state = SPOE_CTX_ST_ERROR;
                        ctx->status_code = (spoe_appctx->status_code + 0x100);
@@ -1372,7 +1372,7 @@ spoe_release_appctx(struct appctx *appctx)
                        LIST_DELETE(&ctx->list);
                        LIST_INIT(&ctx->list);
                        _HA_ATOMIC_DEC(&agent->counters.nb_waiting);
-                       spoe_update_stat_time(&ctx->stats.tv_wait, &ctx->stats.t_waiting);
+                       spoe_update_stat_time(&ctx->stats.wait_ts, &ctx->stats.t_waiting);
                        ctx->spoe_appctx = NULL;
                        ctx->state = SPOE_CTX_ST_ERROR;
                        ctx->status_code = (spoe_appctx->status_code + 0x100);
@@ -1566,7 +1566,7 @@ spoe_handle_sending_frame_appctx(struct appctx *appctx, int *skip)
                        LIST_DELETE(&ctx->list);
                        LIST_INIT(&ctx->list);
                        _HA_ATOMIC_DEC(&agent->counters.nb_sending);
-                       spoe_update_stat_time(&ctx->stats.tv_queue, &ctx->stats.t_queue);
+                       spoe_update_stat_time(&ctx->stats.queue_ts, &ctx->stats.t_queue);
                        ctx->spoe_appctx = NULL;
                        ctx->state = SPOE_CTX_ST_ERROR;
                        ctx->status_code = (SPOE_APPCTX(appctx)->status_code + 0x100);
@@ -1586,7 +1586,7 @@ spoe_handle_sending_frame_appctx(struct appctx *appctx, int *skip)
                        LIST_DELETE(&ctx->list);
                        LIST_INIT(&ctx->list);
                        _HA_ATOMIC_DEC(&agent->counters.nb_sending);
-                       spoe_update_stat_time(&ctx->stats.tv_queue, &ctx->stats.t_queue);
+                       spoe_update_stat_time(&ctx->stats.queue_ts, &ctx->stats.t_queue);
                        ctx->spoe_appctx = SPOE_APPCTX(appctx);
                        if (!(ctx->flags & SPOE_CTX_FL_FRAGMENTED) ||
                            (ctx->frag_ctx.flags & SPOE_FRM_FL_FIN))
@@ -1621,7 +1621,7 @@ spoe_handle_sending_frame_appctx(struct appctx *appctx, int *skip)
                LIST_APPEND(&SPOE_APPCTX(appctx)->waiting_queue, &ctx->list);
        }
        _HA_ATOMIC_INC(&agent->counters.nb_waiting);
-       ctx->stats.tv_wait = now;
+       ctx->stats.wait_ts = tv_to_ns(&now);
        SPOE_APPCTX(appctx)->frag_ctx.ctx    = NULL;
        SPOE_APPCTX(appctx)->frag_ctx.cursid = 0;
        SPOE_APPCTX(appctx)->frag_ctx.curfid = 0;
@@ -1677,8 +1677,8 @@ spoe_handle_receiving_frame_appctx(struct appctx *appctx, int *skip)
                        LIST_DELETE(&ctx->list);
                        LIST_INIT(&ctx->list);
                        _HA_ATOMIC_DEC(&agent->counters.nb_waiting);
-                       spoe_update_stat_time(&ctx->stats.tv_wait, &ctx->stats.t_waiting);
-                       ctx->stats.tv_response = now;
+                       spoe_update_stat_time(&ctx->stats.wait_ts, &ctx->stats.t_waiting);
+                       ctx->stats.response_ts = tv_to_ns(&now);
                        if (ctx->spoe_appctx) {
                                ctx->spoe_appctx->cur_fpa--;
                                ctx->spoe_appctx = NULL;
@@ -2129,8 +2129,8 @@ spoe_queue_context(struct spoe_context *ctx)
         * already assigned and wakeup all idle applets. Otherwise, don't queue
         * it. */
        _HA_ATOMIC_INC(&agent->counters.nb_sending);
-       spoe_update_stat_time(&ctx->stats.tv_request, &ctx->stats.t_request);
-       ctx->stats.tv_queue = now;
+       spoe_update_stat_time(&ctx->stats.request_ts, &ctx->stats.t_request);
+       ctx->stats.queue_ts = tv_to_ns(&now);
        if (ctx->spoe_appctx)
                return 1;
        LIST_APPEND(&agent->rt[tid].sending_queue, &ctx->list);
@@ -2533,13 +2533,13 @@ static void
 spoe_update_stats(struct stream *s, struct spoe_agent *agent,
                  struct spoe_context *ctx, int dir)
 {
-       if (!tv_iszero(&ctx->stats.tv_start)) {
-               spoe_update_stat_time(&ctx->stats.tv_start, &ctx->stats.t_process);
-               ctx->stats.t_total  += ctx->stats.t_process;
-               tv_zero(&ctx->stats.tv_request);
-               tv_zero(&ctx->stats.tv_queue);
-               tv_zero(&ctx->stats.tv_wait);
-               tv_zero(&ctx->stats.tv_response);
+       if (ctx->stats.start_ts != 0) {
+               spoe_update_stat_time(&ctx->stats.start_ts, &ctx->stats.t_process);
+               ctx->stats.t_total    += ctx->stats.t_process;
+               ctx->stats.request_ts  = 0;
+               ctx->stats.queue_ts    = 0;
+               ctx->stats.wait_ts     = 0;
+               ctx->stats.response_ts = 0;
        }
 
        if (agent->var_t_process) {
@@ -2600,8 +2600,8 @@ spoe_start_processing(struct spoe_agent *agent, struct spoe_context *ctx, int di
                return 0;
 
        agent->rt[tid].processing++;
-       ctx->stats.tv_start   = now;
-       ctx->stats.tv_request = now;
+       ctx->stats.start_ts   = tv_to_ns(&now);
+       ctx->stats.request_ts = tv_to_ns(&now);
        ctx->stats.t_request  = -1;
        ctx->stats.t_queue    = -1;
        ctx->stats.t_waiting  = -1;
@@ -2711,8 +2711,8 @@ spoe_process_messages(struct stream *s, struct spoe_context *ctx,
        }
 
        if (ctx->state == SPOE_CTX_ST_ENCODING_MSGS) {
-               if (tv_iszero(&ctx->stats.tv_request))
-                       ctx->stats.tv_request = now;
+               if (ctx->stats.request_ts == 0)
+                       ctx->stats.request_ts = tv_to_ns(&now);
                if (!spoe_acquire_buffer(&ctx->buffer, &ctx->buffer_wait))
                        goto out;
                ret = spoe_encode_messages(s, ctx, messages, dir, type);
@@ -2742,7 +2742,7 @@ spoe_process_messages(struct stream *s, struct spoe_context *ctx,
                ret = 1;
                ctx->frame_id++;
                ctx->state = SPOE_CTX_ST_READY;
-               spoe_update_stat_time(&ctx->stats.tv_response, &ctx->stats.t_response);
+               spoe_update_stat_time(&ctx->stats.response_ts, &ctx->stats.t_response);
                goto end;
        }
 
@@ -2750,7 +2750,7 @@ spoe_process_messages(struct stream *s, struct spoe_context *ctx,
        return ret;
 
   skip:
-       tv_zero(&ctx->stats.tv_start);
+       ctx->stats.start_ts = 0;
        ctx->state = SPOE_CTX_ST_READY;
        spoe_stop_processing(agent, ctx);
        return 1;
@@ -2921,11 +2921,11 @@ spoe_create_context(struct stream *s, struct filter *filter)
        ctx->frame_id    = 1;
        ctx->process_exp = TICK_ETERNITY;
 
-       tv_zero(&ctx->stats.tv_start);
-       tv_zero(&ctx->stats.tv_request);
-       tv_zero(&ctx->stats.tv_queue);
-       tv_zero(&ctx->stats.tv_wait);
-       tv_zero(&ctx->stats.tv_response);
+       ctx->stats.start_ts   =  0;
+       ctx->stats.request_ts =  0;
+       ctx->stats.queue_ts   =  0;
+       ctx->stats.wait_ts    =  0;
+       ctx->stats.response_ts=  0;
        ctx->stats.t_request  = -1;
        ctx->stats.t_queue    = -1;
        ctx->stats.t_waiting  = -1;
@@ -2960,11 +2960,11 @@ spoe_reset_context(struct spoe_context *ctx)
        ctx->state  = SPOE_CTX_ST_READY;
        ctx->flags &= ~(SPOE_CTX_FL_PROCESS|SPOE_CTX_FL_FRAGMENTED);
 
-       tv_zero(&ctx->stats.tv_start);
-       tv_zero(&ctx->stats.tv_request);
-       tv_zero(&ctx->stats.tv_queue);
-       tv_zero(&ctx->stats.tv_wait);
-       tv_zero(&ctx->stats.tv_response);
+       ctx->stats.start_ts   =  0;
+       ctx->stats.request_ts =  0;
+       ctx->stats.queue_ts   =  0;
+       ctx->stats.wait_ts    =  0;
+       ctx->stats.response_ts=  0;
        ctx->stats.t_request  = -1;
        ctx->stats.t_queue    = -1;
        ctx->stats.t_waiting  = -1;