From c703a9d2968b92354d5dcd84dd7993fe86039320 Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Tue, 22 Sep 2015 15:05:06 +0200 Subject: [PATCH] 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. --- src/stick_table.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/stick_table.c b/src/stick_table.c index a51bde3be..c3b76ad61 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);