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,