From: Emeric Brun Date: Wed, 29 Nov 2017 15:15:07 +0000 (+0100) Subject: BUG/MEDIUM: peers: fix some track counter rules dont register entries for sync. X-Git-Tag: v1.9-dev1~638 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0fed0b0a381a90cbb72eb5e32e57e7ce68880d0d;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: peers: fix some track counter rules dont register entries for sync. This BUG was introduced with: 'MEDIUM: threads/stick-tables: handle multithreads on stick tables' The API was reviewed to handle stick table entry updates asynchronously and the caller must now call a 'stkable_touch_*' function each time the content of an entry is modified to register the entry to be synced. There was missing call to stktable_touch_* resulting in not propagated entries to remote peers (or local one during reload) --- diff --git a/include/proto/session.h b/include/proto/session.h index d63d29eb2a..f48c0d4f44 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 f3fb095ff0..8521957ec1 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 04771b78d8..7dd0daf9dd 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);