From 699b67c499c809ce7d11dc447e9d07553c55258d Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 23 Mar 2021 08:58:22 +0100 Subject: [PATCH] BUG/MEDIUM: freq_ctr/threads: use the global_now_ms variable 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". (cherry picked from commit 8cc586c73fefd96f4be1f7820e38a1263f6252ca) Signed-off-by: Willy Tarreau (cherry picked from commit 049602fff734664afbf75b5b28b1d9a028ed9f04) Signed-off-by: Willy Tarreau (cherry picked from commit 84c81577e52b7376e2c03cfd552d3023fa4349ec) Signed-off-by: Willy Tarreau --- include/proto/freq_ctr.h | 2 +- src/freq_ctr.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/proto/freq_ctr.h b/include/proto/freq_ctr.h index 5a1cb32..e3b6557 100644 --- a/include/proto/freq_ctr.h +++ b/include/proto/freq_ctr.h @@ -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); diff --git a/src/freq_ctr.c b/src/freq_ctr.c index d833d3d..a9a5869 100644 --- a/src/freq_ctr.c +++ b/src/freq_ctr.c @@ -201,7 +201,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. @@ -248,7 +248,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. -- 1.7.10.4