diff --git a/include/proto/session.h b/include/proto/session.h index d63d29eb2..f48c0d4f4 100644 --- a/include/proto/session.h +++ b/include/proto/session.h @@ -62,6 +62,9 @@ static inline void session_store_counters(struct session *sess) stktable_data_cast(ptr, conn_cur)--; HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(stkctr->table, ts, 0); } stkctr_set_entry(stkctr, NULL); diff --git a/include/proto/stream.h b/include/proto/stream.h index f3fb095ff..8521957ec 100644 --- a/include/proto/stream.h +++ b/include/proto/stream.h @@ -107,6 +107,9 @@ static inline void stream_store_counters(struct stream *s) stktable_data_cast(ptr, conn_cur)--; HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(s->stkctr[i].table, ts, 0); } stkctr_set_entry(&s->stkctr[i], NULL); stksess_kill_if_expired(s->stkctr[i].table, ts, 1); @@ -142,6 +145,9 @@ static inline void stream_stop_content_counters(struct stream *s) stktable_data_cast(ptr, conn_cur)--; HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(s->stkctr[i].table, ts, 0); } stkctr_set_entry(&s->stkctr[i], NULL); stksess_kill_if_expired(s->stkctr[i].table, ts, 1); @@ -174,6 +180,9 @@ static inline void stream_start_counters(struct stktable *t, struct stksess *ts) ts->expire = tick_add(now_ms, MS_TO_TICKS(t->expire)); HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(t, ts, 0); } /* Enable tracking of stream counters as on stksess . The caller is @@ -221,6 +230,9 @@ static void inline stream_inc_http_req_ctr(struct stream *s) stkctr->table->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u, 1); HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(stkctr->table, ts, 0); } } @@ -255,6 +267,9 @@ static void inline stream_inc_be_http_req_ctr(struct stream *s) stkctr->table->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u, 1); HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(stkctr->table, ts, 0); } } @@ -293,6 +308,9 @@ static void inline stream_inc_http_err_ctr(struct stream *s) stkctr->table->data_arg[STKTABLE_DT_HTTP_ERR_RATE].u, 1); HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(stkctr->table, ts, 0); } } diff --git a/src/proto_http.c b/src/proto_http.c index 04771b78d..7dd0daf9d 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2754,6 +2754,9 @@ resume_execution: t->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u, 1); HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(t, ts, 0); } stkctr_set_flags(&s->stkctr[trk_idx(rule->action)], STKCTR_TRACK_CONTENT); @@ -3054,6 +3057,9 @@ resume_execution: HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock); + /* If data was modified, we need to touch to re-schedule sync */ + stktable_touch_local(t, ts, 0); + stkctr_set_flags(&s->stkctr[trk_idx(rule->action)], STKCTR_TRACK_CONTENT); if (sess->fe != s->be) stkctr_set_flags(&s->stkctr[trk_idx(rule->action)], STKCTR_TRACK_BACKEND);