}
/* Release timer handle */
task->timeout = NULL;
- req_release(worker, (struct req *)req);
+ uv_close((uv_handle_t *)req, on_timer_close); /* Return borrowed task here */
/* Interrupt current pending request. */
task->timeouts += 1;
worker->stats.timeout += 1;
qr_task_step(task, NULL, NULL);
- qr_task_unref(task); /* Return borrowed task */
}
static bool retransmit(struct qr_task *task)
{
uv_timer_stop(req);
struct qr_task *task = req->data;
+ assert(task->finished == false);
+ assert(task->timeout != NULL);
+
+ uv_timer_stop(req);
if (!retransmit(req->data)) {
/* Not possible to spawn request, start timeout timer with remaining deadline. */
uint64_t timeout = KR_CONN_RTT_MAX - task->pending_count * KR_CONN_RETRY;
struct kr_query *leader_qry = array_tail(task->req.rplan.pending);
for (size_t i = task->waiting.len; i --> 0;) {
struct qr_task *follower = task->waiting.at[i];
- struct kr_query *qry = array_tail(follower->req.rplan.pending);
/* Reuse MSGID and 0x20 secret */
- if (qry) {
+ if (follower->req.rplan.pending.len > 0) {
+ struct kr_query *qry = array_tail(follower->req.rplan.pending);
qry->id = leader_qry->id;
qry->secret = leader_qry->secret;
leader_qry->secret = 0; /* Next will be already decoded */