]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: freq_ctr/threads: use the global_now_ms variable
authorWilly Tarreau <w@1wt.eu>
Tue, 23 Mar 2021 07:58:22 +0000 (08:58 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 23 Mar 2021 08:03:37 +0000 (09:03 +0100)
In commit a1ecbca0a ("BUG/MINOR: freq_ctr/threads: make use of the last
updated global time"), for period-based counters, the millisecond part
of the global_now variable was used as the date for the new period. But
it's wrong, it only works with sub-second periods as it wraps every
second, and for other periods the counters never rotate anymore.

Let's make use of the newly introduced global_now_ms variable instead,
which contains the global monotonic time expressed in milliseconds.

This patch needs to be backported wherever the patch above is backported.
It depends on previous commit "MINOR: time: also provide a global,
monotonic global_now_ms timer".

include/haproxy/freq_ctr.h
src/freq_ctr.c

index d5cea414ef15445579e22f07c43bd7b838d63686..b1db43ef664e1704273632dca4e620c7e39b4554 100644 (file)
@@ -88,7 +88,7 @@ static inline unsigned int update_freq_ctr_period(struct freq_ctr_period *ctr,
 
        curr_tick = ctr->curr_tick;
        do {
-               now_ms_tmp = (uint32_t)global_now / 1000;
+               now_ms_tmp = global_now_ms;
                if (now_ms_tmp - curr_tick < period)
                        return _HA_ATOMIC_ADD(&ctr->curr_ctr, inc);
 
index 8fd0c90f0998f0d4eb22530aee105665765cebcc..42fbc1cea60cb27458121f3394a34d58a291a347 100644 (file)
@@ -206,7 +206,7 @@ unsigned int read_freq_ctr_period(struct freq_ctr_period *ctr, unsigned int peri
                        break;
        };
 
-       remain = curr_tick + period - (uint32_t)global_now / 1000;
+       remain = curr_tick + period - global_now_ms;
        if (unlikely((int)remain < 0)) {
                /* We're past the first period, check if we can still report a
                 * part of last period or if we're too far away.
@@ -253,7 +253,7 @@ unsigned int freq_ctr_remain_period(struct freq_ctr_period *ctr, unsigned int pe
                        break;
        };
 
-       remain = curr_tick + period - (uint32_t)global_now / 1000;
+       remain = curr_tick + period - global_now_ms;
        if (likely((int)remain < 0)) {
                /* We're past the first period, check if we can still report a
                 * part of last period or if we're too far away.