changeset 13648:926a7ceeaa10

anvil: Handle crash restarts without failing completely.
author Timo Sirainen <tss@iki.fi>
date Fri, 04 Nov 2011 20:11:39 +0200
parents 9f739df97593
children 64ca27392217
files src/anvil/anvil-connection.c src/anvil/common.h src/anvil/main.c src/master/service-anvil.c src/master/service-anvil.h src/master/service-process.c
diffstat 6 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/anvil/anvil-connection.c	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/anvil/anvil-connection.c	Fri Nov 04 20:11:39 2011 +0200
@@ -150,8 +150,13 @@
 
 		if (!version_string_verify(line, "anvil",
 				ANVIL_CLIENT_PROTOCOL_MAJOR_VERSION)) {
+			if (anvil_restarted && (conn->master || conn->fifo)) {
+				/* old pending data. ignore input until we get
+				   the handshake. */
+				return anvil_connection_input(context);
+			}
 			i_error("Anvil client not compatible with this server "
-				"(mixed old and new binaries?)");
+				"(mixed old and new binaries?) %s", line);
 			anvil_connection_destroy(conn);
 			return;
 		}
--- a/src/anvil/common.h	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/anvil/common.h	Fri Nov 04 20:11:39 2011 +0200
@@ -5,5 +5,6 @@
 
 extern struct connect_limit *connect_limit;
 extern struct penalty *penalty;
+extern bool anvil_restarted;
 
 #endif
--- a/src/anvil/main.c	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/anvil/main.c	Fri Nov 04 20:11:39 2011 +0200
@@ -13,10 +13,12 @@
 #include "penalty.h"
 #include "anvil-connection.h"
 
+#include <stdlib.h>
 #include <unistd.h>
 
 struct connect_limit *connect_limit;
 struct penalty *penalty;
+bool anvil_restarted;
 static struct io *log_fdpass_io;
 
 static void client_connected(struct master_service_connection *conn)
@@ -65,6 +67,7 @@
 
 	restrict_access_by_env(NULL, FALSE);
 	restrict_access_allow_coredumps(TRUE);
+	anvil_restarted = getenv("ANVIL_RESTARTED") != NULL;
 
 	/* delay dying until all of our clients are gone */
 	master_service_set_die_with_master(master_service, FALSE);
--- a/src/master/service-anvil.c	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/master/service-anvil.c	Fri Nov 04 20:11:39 2011 +0200
@@ -125,6 +125,7 @@
 
 	if (service_anvil_global->pid == process->pid)
 		service_anvil_global->pid = 0;
+	service_anvil_global->restarted = TRUE;
 }
 
 void service_anvil_send_log_fd(void)
--- a/src/master/service-anvil.h	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/master/service-anvil.h	Fri Nov 04 20:11:39 2011 +0200
@@ -17,6 +17,8 @@
 	struct io *io_blocking, *io_nonblocking;
 
 	unsigned int process_count;
+	/* anvil crashed and we're now restarting it */
+	bool restarted;
 };
 
 extern struct service_anvil_global *service_anvil_global;
--- a/src/master/service-process.c	Fri Nov 04 19:52:26 2011 +0200
+++ b/src/master/service-process.c	Fri Nov 04 20:11:39 2011 +0200
@@ -188,6 +188,10 @@
 	master_service_env_clean();
 
 	switch (service->type) {
+	case SERVICE_TYPE_ANVIL:
+		if (service_anvil_global->restarted)
+			env_put("ANVIL_RESTARTED=1");
+		break;
 	case SERVICE_TYPE_CONFIG:
 		env_put(t_strconcat(MASTER_CONFIG_FILE_ENV"=",
 				    service->config_file_path, NULL));