]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon on_send: verbose-log transport errors
authorVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 12 Feb 2021 12:33:25 +0000 (13:33 +0100)
committerTomas Krizek <tomas.krizek@nic.cz>
Fri, 5 Mar 2021 11:07:30 +0000 (12:07 +0100)
In some cases we may not have information about failure happening,
but let's log at least what we have in verbose mode.

The [wrkr] tag for worker might be a bit too generic but I kept it for
consistency within file.  I might prefer [tran](sport) or something.

daemon/session.c
daemon/session.h
daemon/worker.c

index 8f97b6818706221f6df8e624f0ddd32df31f61b7..7135297ce010854d4c4643a0ab01c84f00dd3f94 100644 (file)
@@ -260,6 +260,31 @@ struct session_flags *session_flags(struct session *session)
        return &session->sflags;
 }
 
+const char *session_type_str(struct session *session)
+{
+       if (!session || !session->handle) {
+               assert(!EINVAL);
+               return "ERROR";
+       }
+       switch (session->handle->type) {
+       default:
+               assert(!EINVAL);
+               return "ERROR";
+       case UV_UDP:
+               return "UDP";
+       case UV_POLL:
+               return "XDP";
+       case UV_TCP:
+               if (session->sflags.has_http) {
+                       return "DoH";
+               } else if (session->sflags.has_tls) {
+                       return "DoT";
+               } else {
+                       return "TCP";
+               }
+       }
+}
+
 struct sockaddr *session_get_peer(struct session *session)
 {
        return &session->peer.ip;
index 7c4bae4cef60dc6b1bc1efa3839a1a578e97f0ce..ba06aa364a5efb6d738e2015c7f1e9a17ba4e06e 100644 (file)
@@ -80,6 +80,8 @@ int session_tasklist_finalize_expired(struct session *session);
 bool session_is_empty(const struct session *session);
 /** Get pointer to session flags */
 struct session_flags *session_flags(struct session *session);
+/** Get the type of session as string (UDP, TCP, DoT, DoH, XDP). */
+const char *session_type_str(struct session *session);
 /** Get pointer to peer address. */
 struct sockaddr *session_get_peer(struct session *session);
 /** Get pointer to sockname (address of our end, not meaningful for UDP downstream). */
index fbcda129554b146141bfea1d2dece62c541f3e51..8148ad64aec5608cde3aad3f7d389249f34e695f 100644 (file)
@@ -587,11 +587,22 @@ int qr_task_on_send(struct qr_task *task, const uv_handle_t *handle, int status)
        struct session* s = handle->data;
        assert(s);
 
+       struct kr_request *req = &task->ctx->req;
+       struct kr_query *qry = array_tail(req->rplan.pending);
+       const bool is_verbose = VERBOSE_STATUS || kr_log_rtrace_enabled(req);
+       if (is_verbose && !session_flags(s)->outgoing) {
+               // we're after finish phase, so policy.DEBUG_IF cases will lose this line
+               kr_log_req(req, 0, 0, "wrkr", "sending reply over %s: %s\n",
+                               session_type_str(s), kr_strerror(status));
+       } else if (is_verbose && session_flags(s)->outgoing && status) {
+               VERBOSE_MSG(qry, "sending query over %s: %s\n",
+                               session_type_str(s), kr_strerror(status));
+       }
+
        if (handle->type == UV_UDP && session_flags(s)->outgoing) {
                // This should ensure that we are only dealing with our question to upstream
                assert(!knot_wire_get_qr(task->pktbuf->wire));
                // start the timer
-               struct kr_query *qry = array_tail(task->ctx->req.rplan.pending);
                assert(qry != NULL);
                (void)qry;
                size_t timeout = task->transport->timeout;