From: Grigorii Demidov Date: Thu, 16 Nov 2017 11:27:46 +0000 (+0100) Subject: daemon/worker: retry all waiting tasks if upstream drops TCP connection X-Git-Tag: v2.0.0~43^2~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=29c959638c1a65f800c62a7ac2399db9ae1ddec8;p=thirdparty%2Fknot-resolver.git daemon/worker: retry all waiting tasks if upstream drops TCP connection --- diff --git a/daemon/worker.c b/daemon/worker.c index 7cb343a60..a63644fd6 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -1801,27 +1801,30 @@ int worker_process_tcp(struct worker_ctx *worker, uv_stream_t *handle, */ uv_timer_t *timer = &session->timeout; uv_timer_stop(timer); + struct sockaddr *peer = &session->peer.ip; + worker_del_tcp_connected(worker, peer); + session->connected = false; while (session->waiting.len > 0) { struct qr_task *task = session->waiting.at[0]; + array_del(session->waiting, 0); + qr_task_unref(task); + session_del_tasks(session, task); if (session->outgoing) { - qr_task_finalize(task, KR_STATE_FAIL); + qr_task_step(task, task->addrlist, NULL); } else { assert(task->ctx->source.session == session); task->ctx->source.session = NULL; } - array_del(session->waiting, 0); - qr_task_unref(task); - session_del_tasks(session, task); } while (session->tasks.len > 0) { struct qr_task *task = session->tasks.at[0]; + session_del_tasks(session, task); if (session->outgoing) { - qr_task_finalize(task, KR_STATE_FAIL); + qr_task_step(task, task->addrlist, NULL); } else { assert(task->ctx->source.session == session); task->ctx->source.session = NULL; } - session_del_tasks(session, task); } session_close(session); return kr_error(ECONNRESET);