]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: When client disconnects during a running command, log the IO input/output wait...
authorTimo Sirainen <tss@iki.fi>
Thu, 12 Nov 2015 10:17:04 +0000 (12:17 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 12 Nov 2015 10:17:04 +0000 (12:17 +0200)
This is mainly useful for debugging to make sure that the hang isn't
happening because of a bug (missing io) in Dovecot.

src/imap/imap-client.c

index 2656647c565a24a1aef7bbeef160a7d68732f0af..c7367ae508d6de17a362a3e34487694955d0bafa 100644 (file)
@@ -261,6 +261,8 @@ static const char *client_get_commands_status(struct client *client)
        uint64_t running_usecs = 0, ioloop_wait_usecs;
        unsigned long long bytes_in = 0, bytes_out = 0;
        string_t *str;
+       enum io_condition cond;
+       const char *cond_str;
 
        if (client->command_queue == NULL)
                return "";
@@ -276,12 +278,22 @@ static const char *client_get_commands_status(struct client *client)
                bytes_out += cmd->bytes_out;
        }
 
+       cond = io_loop_find_fd_conditions(current_ioloop, client->fd_out);
+       if ((cond & (IO_READ | IO_WRITE)) != 0)
+               cond_str = "input/output";
+       else if ((cond & IO_READ) != 0)
+               cond_str = "input";
+       else if ((cond & IO_WRITE) != 0)
+               cond_str = "output";
+       else
+               cond_str = "nothing";
+
        ioloop_wait_usecs = io_loop_get_wait_usecs(current_ioloop);
        msecs_in_ioloop = (ioloop_wait_usecs -
                client->command_queue->start_ioloop_wait_usecs + 999) / 1000;
-       str_printfa(str, " running for %d.%03d + waiting for %d.%03d secs",
+       str_printfa(str, " running for %d.%03d + waiting %s for %d.%03d secs",
                    (int)((running_usecs+999)/1000 / 1000),
-                   (int)((running_usecs+999)/1000 % 1000),
+                   (int)((running_usecs+999)/1000 % 1000), cond_str,
                    msecs_in_ioloop / 1000, msecs_in_ioloop % 1000);
        str_printfa(str, ", %llu B in + %llu+%"PRIuSIZE_T" B out)",
                    bytes_in, bytes_out,