mirror of
https://github.com/haproxy/haproxy.git
synced 2026-04-21 14:17:30 -04:00
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.
This commit is contained in:
parent
8c62c47cb2
commit
c703a9d296
1 changed files with 5 additions and 3 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue