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 a51bde3..c3b76ad 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -255,9 +255,11 @@
/* 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);