if (s->tasks.len == 0) {
worker_session_close(s);
} else { /* If there are tasks running, defer until they finish. */
- uv_timer_start(&s->timeout, tcp_timeout_trigger, 1, KR_CONN_RTT_MAX/2);
+ uv_timer_start(&s->timeout, tcp_timeout_trigger,
+ MAX_TCP_INACTIVITY, MAX_TCP_INACTIVITY);
}
}
/* Connection spawned at least one request, reset its deadline for next query.
return;
}
+ uint64_t timeout = KR_CONN_RTT_MAX / 2;
session->has_tls = tls;
- if (tls && !session->tls_ctx) {
- session->tls_ctx = tls_new(master->loop->data);
- session->tls_ctx->c.session = session;
- session->tls_ctx->c.handshake_state = TLS_HS_IN_PROGRESS;
+ if (tls) {
+ timeout += KR_CONN_RTT_MAX * 3;
+ if (!session->tls_ctx) {
+ session->tls_ctx = tls_new(master->loop->data);
+ session->tls_ctx->c.session = session;
+ session->tls_ctx->c.handshake_state = TLS_HS_IN_PROGRESS;
+ }
}
uv_timer_t *timer = &session->timeout;
- uv_timer_start(timer, tcp_timeout_trigger, KR_CONN_RTT_MAX/2, KR_CONN_RTT_MAX/2);
+ uv_timer_start(timer, tcp_timeout_trigger, timeout, timeout);
io_start_read((uv_handle_t *)client);
}
if (session->waiting.len > 0) {
struct qr_task *t = session->waiting.at[0];
int ret = qr_task_send(t, handle, &session->peer.ip, t->pktbuf);
- uv_timer_t *timer = &session->timeout;
- uv_timer_stop(timer);
- if (ret == kr_ok()) {
- session->timeout.data = session;
- timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0);
- } else {
+ if (ret != kr_ok()) {
while (session->waiting.len > 0) {
struct qr_task *t = session->waiting.at[0];
if (session->outgoing) {
struct qr_task *task = session->waiting.at[0];
ret = qr_task_send(task, session->handle, &peer->ip, task->pktbuf);
}
- uv_timer_stop(&session->timeout);
- session->timeout.data = session;
- timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0);
return ret;
}
worker_del_tcp_connected(worker, &peer->ip);
assert(session->tasks.len == 0);
session_close(session);
+ } else {
+ uv_timer_stop(&session->timeout);
+ session->timeout.data = session;
+ timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0);
}
return kr_ok();
}
if (ret == kr_ok()) {
ret = session_next_waiting_send(session);
if (ret == kr_ok()) {
+ timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0);
worker_add_tcp_connected(worker, &session->peer.ip, session);
iorequest_release(worker, req);
return;
assert(session->outgoing);
uv_timer_stop(timer);
struct worker_ctx *worker = get_worker();
-
if (session->outgoing) {
if (session->has_tls) {
worker_del_tcp_waiting(worker, &session->peer.ip);
session_close(session);
return qr_task_finalize(task, KR_STATE_FAIL);
}
- uv_timer_stop(&session->timeout);
- ret = timer_start(session, on_tcp_watchdog_timeout,
- MAX_TCP_INACTIVITY, 0);
+ if (session->tasks.len == 1) {
+ uv_timer_stop(&session->timeout);
+ ret = timer_start(session, on_tcp_watchdog_timeout,
+ MAX_TCP_INACTIVITY, 0);
+ }
if (ret < 0) {
session_del_waiting(session, task);
session_del_tasks(session, task);
/* Message was assembled, clear temporary. */
session->buffering = NULL;
session->msg_hdr_idx = 0;
+ if (session->outgoing) {
+ session_del_tasks(session, task);
+ }
/* Parse the packet and start resolving complete query */
int ret = parse_packet(pkt_buf);
if (ret == 0) {
if (session->outgoing) {
- session_del_tasks(session, task);
/* To prevent slow lorris attack restart watchdog only after
* the whole message was successfully assembled and parsed */
uv_timer_stop(&session->timeout);
- if (session->tasks.len > 0) {
- timer_start(session, on_tcp_watchdog_timeout,
- MAX_TCP_INACTIVITY, 0);
+ if (session->tasks.len > 0 || session->waiting.len > 0) {
+ timer_start(session, on_tcp_watchdog_timeout, MAX_TCP_INACTIVITY, 0);
}
} else {
/* Start only new queries,
assert(false);
}
}
+ }
+ if (ret == 0) {
const struct sockaddr *addr = session->outgoing ? &session->peer.ip : NULL;
/* since there can be next dns message, we must to proceed
* even if qr_task_step() returns error */