From: Timo Sirainen Date: Wed, 15 Nov 2017 22:53:34 +0000 (+0200) Subject: director: Make sure a missing right-side connection is always reconnected X-Git-Tag: 2.3.0.rc1~443 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5967394396acaa4aaa249ea973423aa5b9c38ed;p=thirdparty%2Fdovecot%2Fcore.git director: Make sure a missing right-side connection is always reconnected This code shouldn't be needed, but add it just to be sure. --- diff --git a/src/director/director.c b/src/director/director.c index 4443b62233..77599fe0ef 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -386,9 +386,34 @@ void director_sync_send(struct director *dir, struct director_host *host, director_connection_ping(dir->right); } +static bool +director_has_any_outgoing_connections(struct director *dir) +{ + struct director_connection *const *connp; + + array_foreach(&dir->connections, connp) { + if (!director_connection_is_incoming(*connp)) + return TRUE; + } + return FALSE; +} + bool director_resend_sync(struct director *dir) { - if (!dir->ring_synced && dir->left != NULL && dir->right != NULL) { + if (dir->ring_synced) { + /* everything ok, no need to do anything */ + return FALSE; + } + + if (dir->right == NULL) { + /* right side connection is missing. make sure we're not + hanging due to some bug. */ + if (dir->to_reconnect == NULL && + !director_has_any_outgoing_connections(dir)) { + i_warning("Right side connection is unexpectedly lost, reconnecting"); + director_connect(dir, "Right side connection lost"); + } + } else if (dir->left != NULL) { /* send a new SYNC in case the previous one got dropped */ dir->self_host->last_sync_timestamp = ioloop_time; director_sync_send(dir, dir->self_host, dir->sync_seq,