Hi,
I've stumble upon a problem with a specific sequence of expiring,
stopping and (re)starting tw timers.
In pseudo C code the pattern is
Lets assume some kind of timer in a session gets started with:
session->timer[0] = tw_timer_start (tw, interval_a);
session->timer[1] = tw_timer_start (tw, interval_b);
...
session->timer[n] = tw_timer_start (tw, interval_n);
while (42) {
tw_timer_expire (tw, expired);
foreach (e, expired) {
session = session_from_timer_id(e);
foreach (t, session->timer) {
if (t->timer_id != INVALID_ID)
tw_timer_stop (tw, t->timer_id);
t->timer_id = tw_timer_start (tw, interval);
}
}
With this sequence, tw_timer_stop might stop the wrong timer.
The problem is that tw_timer_expire removes the timer from its
internal pool. The timer_id itself is now invalid, but the timer_id
stored in the external session timer data structure is not cleared.
The following stop will find the timer_id and try to stop it. The
following start will lead to the use of a new pool entry from the
wheels internal pool.
What can happen is that a pool entry release by tw_timer_expire is
reused in the loop by tw_timer_start only to be erroneously stopped by
tw_timer_stop in a later iteration of the inner loop.
Is the above explanation understandable and/or disagrees anyone with
the conclusion?
After finding the problem in my code, I wanted to see what VPP is
doing. And it seems that at least the SCTP timer code handling has
this exact issue.
Regards
Andreas
--
Andreas Schultz
--
Principal Engineer
t: +49 391 819099-224
------------------------------- enabling your networks
-----------------------------
Travelping GmbH
Roentgenstraße 13
39108 Magdeburg
Germany
t: +49 391 819099-0
f: +49 391 819099-299
e: [email protected]
w: https://www.travelping.com/
Company registration: Amtsgericht Stendal Reg. No.: HRB 10578
Geschaeftsfuehrer: Holger Winkelmann VAT ID: DE236673780
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#13440): https://lists.fd.io/g/vpp-dev/message/13440
Mute This Topic: https://lists.fd.io/mt/32307309/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-