[SR-Users] Multiple async operations in single transaction fail (using http_async_client)

Thom Seddon thom at telcom.io
Thu May 26 19:05:26 CEST 2016


Hi All,

I've been doing some work this week with the new http_async_client module,
it seems that with it's default behaviour it's not possible to execute
another async query in the block immediately following the response, for
example the following config:

request_route {
  if (!t_newtran()) {
      sl_reply_error();
      exit();
  }
  http_async_query("http://localhost:8090/req_1", '{"user":"$fU"}',
"REQ_1");
}

route[REQ_1] {
  xlog("L_INFO", "route[REQ_1]: INIT\n");
  if ($http_ok) {
    xlog("L_INFO", "route[REQ_1]: status $http_rs\n");
    xlog("L_INFO", "route[REQ_1]: Sending REQ_2\n");
    http_async_query("http://localhost:8090/req_2", '{"user":"$fU"}',
"REQ_2");
  } else {
    xlog("L_INFO", "route[REQ_1]: error  $http_err)\n");
  }
}

route[REQ_2] {
  xlog("L_INFO", "route[REQ_2]: INIT\n");
  if ($http_ok) {
    xlog("L_INFO", "route[REQ_2]: status $http_rs\n");
  } else {
    xlog("L_INFO", "route[REQ_2]: error  $http_err)\n");
  }
}

Generates the following error:

10(11832) INFO: <script>: route[REQ_1]: INIT
10(11832) INFO: <script>: route[REQ_1]: status 200
10(11832) INFO: <script>: route[REQ_1]: Sending REQ_2
10(11832) WARNING: tm [t_suspend.c:186]: t_continue(): transaction is not
suspended [53195:560306836]

Looking at the source, http_async_client calls t_suspend, then goes away
and performs the request in the background. On response it calls t_continue
and then this block
<https://github.com/kamailio/kamailio/blob/4.4/modules/tm/t_suspend.c#L270-L275>
in t_continue will continue execution, the second query will cause
http_async_client to call t_suspend whilst sill executing from
the previous t_continue. Once they query is sent, the first t_continue will
complete, removing the T_ASYNC_SUSPENDED flag. When the second query
returns it doesn't find the flag and so fails as shown.

I'm far from an expect on this so would really appreciate some pointers, it
seems to fundamental to be a race condition in tm but the usage in
http_async_client seems to match usage in other modules so I'm not sure on
the best tactic.
I've tried peppering append_branch and async_route call's in various places
to no avail.

Full debug log here: http://pastebin.com/raw/rFmm0fmf

Any help appreciated,

*Thom Seddon*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20160526/272b72b6/attachment.html>


More information about the sr-users mailing list