Mercurial > dovecot > core-2.2
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));