The instance is official 4.3.1 with no custom modules, the only patch is
jsonrpc_io.c from #268 to avoid crash when connect a jsonrpc server which was
not up.
However, after some experiments, it is caused by execute t_continue() on a
transaction that are not suspend.
I can avoid it by adjust script, but did not know which component that actually
killed kamailio. but I think it can be reproduce.
#### Described below:
We have implement a push join algorithm introduced by Danail at Kamailio World
2014. [Aynchronous Processing in Kamailio Configuration
File](http://www.slideshare.net/miconda/26-danielconstantinmierlakamailiocfgasync)
Let's say the caller A wants to call callee B who is offline:
```
1. A send INVITE to KAMAILIO
2. set t_set_fr(60000, 4000) to simulate max-wait-timeout for a suspended
transaction. ( which is 4 Secs )
3. KAMAILIO suspend this transaction via t_suspend()
4. KAMAILIO stores transaction id in htable with timeout 10 Secs ( htable
timeout set via modparam )
5. B did NOT register within 4 Secs. then A timed out.
6. this transaction will go to a failure_route that we armed before suspend.
7. in failure route, A will continue to dial another phone number ( says pstn
), send INVITE to another server, and waiting for 180.
8. B registered after 4 Secs but before 10 Secs ( htable not delete that record
yet )
9. so issue t_continue() on transaction A. But it will NOT send anything to B
actually. you will see kamailio complaining "script writer didn't release
transaction" in syslog. And looks like KAMAILIO did some cleaning procedure.
10. when KAMAILIO received response 180 or 183 from the remote server, sooner
or later kamailio will crash (at onsend_route or onreply_route, occurs often
when parsing Cseq. )
11. If A send a CANCEL at this moment, kamailio will generate a fake 487
response and swallows it, no forward to remote server, and remote server will
waiting 200 ok, left a blocking dead channel alone.
```
currently I delete record in htable after max-wait-timeout, and everything
works fine.
#### Question:
Is it possible if B registered and lookup htable after max-wait-timeout but
before we delete htable record in timeout failure_route() ? ( edge case race
condition )
#### In the name of kamailio:
Ha, I love the sentence "It should not crash in any case.", it really should
become a slogan of kamailio.
"kamailio - it never crash"
Anyway, no matter whether I can avoid crash by adjust config file now or not, I
will grant you access if you need. it looks like a hell of corefiles though.
please tell me what's the mail address I should send to, and I'll prepare for
it.
for better kamailio, cheers.
---
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/322#issuecomment-139879395
_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev