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();
}
}
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");
} 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 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.
Any help appreciated,