dovecot-2.2: director: If we disconnect a director, pass the rea...
dovecot at dovecot.org
dovecot at dovecot.org
Wed May 13 01:13:34 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/27baf04f2b18
changeset: 18662:27baf04f2b18
user: Timo Sirainen <tss at iki.fi>
date: Wed May 13 04:10:18 2015 +0300
description:
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
diffstat:
src/director/director-connection.c | 42 +++++++++++++++++++++++--------------
1 files changed, 26 insertions(+), 16 deletions(-)
diffs (132 lines):
diff -r f43adca71e15 -r 27baf04f2b18 src/director/director-connection.c
--- a/src/director/director-connection.c Wed May 13 04:07:46 2015 +0300
+++ b/src/director/director-connection.c Wed May 13 04:10:18 2015 +0300
@@ -131,11 +131,13 @@
unsigned int done_pending:1;
};
-static void director_connection_disconnected(struct director_connection **conn);
+static void director_connection_disconnected(struct director_connection **conn,
+ const char *reason);
static void director_connection_reconnect(struct director_connection **conn,
const char *reason);
static void
-director_connection_log_disconnect(struct director_connection *conn, int err);
+director_connection_log_disconnect(struct director_connection *conn, int err,
+ const char *errstr);
static int director_connection_send_done(struct director_connection *conn);
static void ATTR_FORMAT(2, 3)
@@ -169,7 +171,7 @@
i_error("director(%s): Handshaking DONE timed out (%u secs)",
conn->name, secs);
}
- director_connection_disconnected(&conn);
+ director_connection_disconnected(&conn, "Handshake timeout");
}
static void
@@ -187,7 +189,7 @@
static void director_connection_wait_timeout(struct director_connection *conn)
{
- director_connection_log_disconnect(conn, ETIMEDOUT);
+ director_connection_log_disconnect(conn, ETIMEDOUT, "");
director_connection_deinit(&conn,
"Timeout waiting for disconnect after CONNECT");
}
@@ -1453,7 +1455,8 @@
}
static void
-director_connection_log_disconnect(struct director_connection *conn, int err)
+director_connection_log_disconnect(struct director_connection *conn, int err,
+ const char *errstr)
{
unsigned int secs = ioloop_time - conn->created;
string_t *str = t_str_new(128);
@@ -1471,7 +1474,10 @@
str_append(str, "Connection closed");
if (err != 0 && err != EPIPE) {
errno = err;
- str_printfa(str, ": %m");
+ if (errstr[0] == '\0')
+ str_printfa(str, ": %m");
+ else
+ str_printfa(str, ": %s", errstr);
}
str_printfa(str, " (connected %u secs, "
@@ -1496,8 +1502,9 @@
return;
case -1:
/* disconnected */
- director_connection_log_disconnect(conn, conn->input->stream_errno);
- director_connection_disconnected(&conn);
+ director_connection_log_disconnect(conn, conn->input->stream_errno,
+ i_stream_get_error(conn->input));
+ director_connection_disconnected(&conn, i_stream_get_error(conn->input));
return;
case -2:
/* buffer full */
@@ -1637,10 +1644,12 @@
o_stream_cork(conn->output);
ret = director_connection_send_users(conn);
o_stream_uncork(conn->output);
- if (ret < 0)
- director_connection_disconnected(&conn);
- else
+ if (ret < 0) {
+ director_connection_disconnected(&conn,
+ o_stream_get_error(conn->output));
+ } else {
o_stream_set_flush_pending(conn->output, TRUE);
+ }
return ret;
}
return o_stream_flush(conn->output);
@@ -1698,7 +1707,7 @@
if ((err = net_geterror(conn->fd)) != 0) {
i_error("director(%s): connect() failed: %s", conn->name,
strerror(err));
- director_connection_disconnected(&conn);
+ director_connection_disconnected(&conn, strerror(err));
return;
}
conn->connected = TRUE;
@@ -1810,7 +1819,8 @@
}
}
-void director_connection_disconnected(struct director_connection **_conn)
+void director_connection_disconnected(struct director_connection **_conn,
+ const char *reason)
{
struct director_connection *conn = *_conn;
struct director *dir = conn->dir;
@@ -1822,7 +1832,7 @@
conn->host->last_network_failure = ioloop_time;
}
- director_connection_deinit(_conn, "");
+ director_connection_deinit(_conn, reason);
if (dir->right == NULL)
director_connect(dir);
}
@@ -1868,14 +1878,14 @@
director_connection_ping_idle_timeout(struct director_connection *conn)
{
i_error("director(%s): Ping timed out, disconnecting", conn->name);
- director_connection_disconnected(&conn);
+ director_connection_disconnected(&conn, "Ping timeout");
}
static void director_connection_pong_timeout(struct director_connection *conn)
{
i_error("director(%s): PONG reply not received although other "
"input keeps coming, disconnecting", conn->name);
- director_connection_disconnected(&conn);
+ director_connection_disconnected(&conn, "Pong timeout");
}
void director_connection_ping(struct director_connection *conn)
More information about the dovecot-cvs
mailing list