Mercurial > dovecot > core-2.2
changeset 22667:6b14fe31f657
director: Make sure a missing right-side connection is always reconnected
This code shouldn't be needed, but add it just to be sure.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 16 Nov 2017 00:53:34 +0200 |
parents | 0b8c69533353 |
children | 3d99067fb0b9 |
files | src/director/director.c |
diffstat | 1 files changed, 26 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/director/director.c Thu Nov 16 00:44:17 2017 +0200 +++ b/src/director/director.c Thu Nov 16 00:53:34 2017 +0200 @@ -394,9 +394,34 @@ 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,