Thanks for highlighting this issue. Typically, the expired timer callback sets 
the timer_id to invalid which prevents confusion.

I'll pass along the SCTP report.

Dave 

-----Original Message-----
From: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> On Behalf Of Andreas Schultz
Sent: Thursday, July 4, 2019 8:21 AM
To: vpp-dev@lists.fd.io
Subject: [vpp-dev] unsave tw_timer_expire + tw_timer_stop + tw_timer_start 
pattern

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); timer[1] =  
session->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: i...@travelping.com

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 (#13442): https://lists.fd.io/g/vpp-dev/message/13442
Mute This Topic: https://lists.fd.io/mt/32307309/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to