From: Emeric Brun Date: Tue, 22 Sep 2015 13:05:06 +0000 (+0200) Subject: BUG/MEDIUM: peers: some table updates are randomly not pushed. X-Git-Tag: v1.6-dev6~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c703a9d2968b92354d5dcd84dd7993fe86039320;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: peers: some table updates are randomly not pushed. If an entry is still not present in the update tree, we could miss to schedule for a push depending of an un-initialized value (upd.key remains un-initialized for new sessions or isn't re-initalized for reused ones). In the same way, if an entry is present in the tree, but its update's tick is far in the past (> 2^31). We could consider it's still scheduled even if it is not the case. The fix consist to force the re-scheduling of an update if it was not present in the updates tree or if the update is not in the scheduling window of every peers. --- diff --git a/src/stick_table.c b/src/stick_table.c index a51bde3be5..c3b76ad618 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -255,9 +255,11 @@ struct stksess *stktable_touch(struct stktable *t, struct stksess *ts, int local /* If sync is enabled and update is local */ if (t->sync_task && local) { - /* If this entry was already pushed to a peer - We want to push it again */ - if ((int)(ts->upd.key - t->commitupdate) <= 0) { + /* If this entry is not in the tree + or not scheduled for at least one peer */ + if (!ts->upd.node.leaf_p + || (int)(t->commitupdate - ts->upd.key) >= 0 + || (int)(ts->upd.key - t->localupdate) >= 0) { ts->upd.key = ++t->update; t->localupdate = t->update; eb32_delete(&ts->upd);