Hi, community!
I have in my Kamailio script following block (while REGISTER processing,
after auth succeed):
.....
/* Save to usrloc */
lock("LOCATION_LOCK");
if (!save("location")) {
unlock("LOCATION_LOCK");
sl_reply_error();
exit();
}
unlock("LOCATION_LOCK");
......
According to module documentation - if "save" - failed (for any reason) - I
expected the control to be returned to the script with error code "-1"
But, there are cases - when this does not happen - which lead to deadlock
for workers processing REGISTERs (I never unlock("LOCATION_LOCK")):
- module answers with internal error - and return 0 from "save" function:
https://github.com/kamailio/kamailio/blob/master/src/modules/registrar/saveā¦
- line 1013
My use case happened due to malfunctioning device that in some moment of
time:
- send REGISTER update
- kamailio answers 200OK
- device retransmit the same REGISTER (same CSeq)
- during 20 seconds (hardcoded value in registrar module) - kamailio answers
200OK (and everything is ok)
- if retransmission continue more than 20s - kamailio answered 400 Bad
request, and did not return control to script (as a result I had no chance
to unlock("LOCATION_LOCK") from code above)
Tested it on kamailio 4.2.5 and 5.0.3.
as for me, possible solutions are:
- return -1 instead of 0 from "save" by default
- if there are some reasons not to do this - we should change documentation,
and explicitly mention that there are cases - when script execution is
stopped.
thanks in advance!
cheers
--
Sent from:
http://sip-router.1086192.n5.nabble.com/Users-f3.html