--------
- http module: only run prometheus in parent process if using --forks=N,
as the submodule collects metrics from all sub-processes as well.
-- TLS fixes for corner cases (!714, !700)
+- TLS fixes for corner cases (!700, !714, !721)
- fix build with -DNOVERBOSELOG (#424)
- policy.{FORWARD,TLS_FORWARD,STUB}: respect net.ipv{4,6} setting (!710)
uv_handle_t *handle = session->handle;
io_stop_read(handle);
session->sflags.closing = true;
- if (session->peer.ip.sa_family != AF_UNSPEC && handle->type == UV_TCP) {
- struct worker_ctx *worker = handle->loop->data;
- struct sockaddr *peer = &session->peer.ip;
- worker_del_tcp_connected(worker, peer);
- session->sflags.connected = false;
- }
if (!uv_is_closing((uv_handle_t *)&session->timeout)) {
uv_timer_stop(&session->timeout);
static int worker_add_tcp_waiting(struct worker_ctx *worker,
const struct sockaddr *addr,
struct session *session);
-static int worker_del_tcp_waiting(struct worker_ctx *worker,
- const struct sockaddr *addr);
static struct session* worker_find_tcp_waiting(struct worker_ctx *worker,
const struct sockaddr *addr);
static void on_tcp_connect_timeout(uv_timer_t *timer);
if (ret != kr_ok()) {
/* Something went wrong.
- * Session isn't in the list of waiting sessions,
- * or addition to the list of connected sessions failed,
+ * Either addition to the list of connected sessions
* or write to upstream failed. */
worker_del_tcp_connected(worker, peer);
session_waitinglist_finalize(session, KR_STATE_FAIL);
struct qr_task *t = session_waitinglist_get(session);
ret = qr_task_send(t, session, NULL, NULL);
if (ret != 0) {
+ struct worker_ctx *worker = t->ctx->worker;
+ struct sockaddr *peer = session_get_peer(session);
session_waitinglist_finalize(session, KR_STATE_FAIL);
session_tasklist_finalize(session, KR_STATE_FAIL);
+ worker_del_tcp_connected(worker, peer);
session_close(session);
break;
}
ret = send_waiting(session);
if (ret != 0) {
- worker_del_tcp_connected(worker, peer);
return;
}
/* Error, finalize task with SERVFAIL and
* close connection to upstream. */
session_tasklist_finalize(session, KR_STATE_FAIL);
+ worker_del_tcp_connected(worker, session_get_peer(session));
session_close(session);
return kr_error(EINVAL);
}
return map_add_tcp_session(&worker->tcp_waiting, addr, session);
}
-static int worker_del_tcp_waiting(struct worker_ctx *worker,
- const struct sockaddr* addr)
+int worker_del_tcp_waiting(struct worker_ctx *worker,
+ const struct sockaddr* addr)
{
assert(addr && tcpsess_key(addr));
return map_del_tcp_session(&worker->tcp_waiting, addr);
struct worker_ctx *worker = handle->loop->data;
struct sockaddr *peer = session_get_peer(session);
+ worker_del_tcp_waiting(worker, peer);
worker_del_tcp_connected(worker, peer);
session_flags(session)->connected = false;