struct qr_task *session_waitinglist_get(const struct session *session)
{
- return queue_head(session->waiting);
+ return (queue_len(session->waiting) > 0) ? (queue_head(session->waiting)) : NULL;
}
struct qr_task *session_waitinglist_pop(struct session *session, bool deref)
kr_log_verbose("[%s] TLS handshake with %s has completed\n",
logstring, kr_straddr(peer));
if (handshake_cb) {
- handshake_cb(session, 0);
+ if (handshake_cb(session, 0) != kr_ok()) {
+ return kr_error(EIO);
+ }
}
} else if (err == GNUTLS_E_AGAIN) {
return kr_error(EAGAIN);
if (status) {
struct qr_task *task = session_waitinglist_get(session);
- struct kr_qflags *options = &task->ctx->req.options;
- unsigned score = options->FORWARD || options->STUB ? KR_NS_FWD_DEAD : KR_NS_DEAD;
- kr_nsrep_update_rtt(NULL, peer, score,
- worker->engine->resolver.cache_rtt,
- KR_NS_UPDATE_NORESET);
+ if (task) {
+ struct kr_qflags *options = &task->ctx->req.options;
+ unsigned score = options->FORWARD || options->STUB ? KR_NS_FWD_DEAD : KR_NS_DEAD;
+ kr_nsrep_update_rtt(NULL, peer, score,
+ worker->engine->resolver.cache_rtt,
+ KR_NS_UPDATE_NORESET);
+ }
+#ifndef NDEBUG
+ else {
+ /* Task isn't in the list of tasks
+ * waiting for connection to upstream.
+ * So that it MUST be unsuccessful rehandshake.
+ * Check it. */
+ assert(deletion_res != 0);
+ const char *key = tcpsess_key(peer);
+ assert(key);
+ assert(map_contains(&worker->tcp_connected, key) != 0);
+ }
+#endif
return ret;
}