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.2.34~222 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0bd35db68be764ab947f458e53384b169b49654e;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 e13403126c..5faf8ca805 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -394,9 +394,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,