]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: retry all waiting tasks if upstream drops TCP connection
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Thu, 16 Nov 2017 11:27:46 +0000 (12:27 +0100)
committerPetr Špaček <petr.spacek@nic.cz>
Mon, 8 Jan 2018 11:00:59 +0000 (12:00 +0100)
daemon/worker.c

index 7cb343a60d1d7f82f6584fbcffe9f169f91b3ea7..a63644fd69e01d35bebf1af732900f9d00b00a81 100644 (file)
@@ -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);