changeset 14933:f33e3ac28e1d

imapc: Added imapc_max_idle_time setting to force activity on connection. Reducing this from the default 29 minutes should help when there's a stateful firewall between imapc and the backend server.
author Timo Sirainen <tss@iki.fi>
date Tue, 14 Aug 2012 23:09:44 +0300
parents 7a1f49b588a8
children 501f22bf92c3
files src/lib-imap-client/imapc-client.h src/lib-imap-client/imapc-connection.c src/lib-storage/index/imapc/imapc-settings.c src/lib-storage/index/imapc/imapc-settings.h src/lib-storage/index/imapc/imapc-storage.c
diffstat 5 files changed, 9 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-client.h	Tue Aug 14 03:03:26 2012 +0300
+++ b/src/lib-imap-client/imapc-client.h	Tue Aug 14 23:09:44 2012 +0300
@@ -52,6 +52,7 @@
 	const char *master_user;
 	const char *username;
 	const char *password;
+	unsigned int max_idle_time;
 
 	const char *dns_client_socket_path;
 	const char *temp_path_prefix;
--- a/src/lib-imap-client/imapc-connection.c	Tue Aug 14 03:03:26 2012 +0300
+++ b/src/lib-imap-client/imapc-connection.c	Tue Aug 14 23:09:44 2012 +0300
@@ -24,8 +24,6 @@
 #define IMAPC_CONNECT_TIMEOUT_MSECS (1000*30)
 #define IMAPC_COMMAND_TIMEOUT_MSECS (1000*60*5)
 #define IMAPC_MAX_INLINE_LITERAL_SIZE (1024*32)
-/* IMAP protocol requires activity at least every 30 minutes */
-#define IMAPC_MAX_IDLE_MSECS (1000*60*29)
 
 enum imapc_input_state {
 	IMAPC_INPUT_STATE_NONE = 0,
@@ -1306,7 +1304,7 @@
 	conn->parser = imap_parser_create(conn->input, NULL, (size_t)-1);
 	conn->to = timeout_add(IMAPC_CONNECT_TIMEOUT_MSECS,
 			       imapc_connection_timeout, conn);
-	conn->to_output = timeout_add(IMAPC_MAX_IDLE_MSECS,
+	conn->to_output = timeout_add(conn->client->set.max_idle_time*1000,
 				      imapc_connection_reset_idle, conn);
 	if (conn->client->set.debug) {
 		i_debug("imapc(%s): Connecting to %s:%u", conn->name,
--- a/src/lib-storage/index/imapc/imapc-settings.c	Tue Aug 14 03:03:26 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.c	Tue Aug 14 23:09:44 2012 +0300
@@ -28,6 +28,8 @@
 	DEF(SET_STR, imapc_features),
 	DEF(SET_STR, imapc_rawlog_dir),
 	DEF(SET_STR, imapc_list_prefix),
+	DEF(SET_TIME, imapc_max_idle_time),
+
 	DEF(SET_STR, ssl_crypto_device),
 
 	SETTING_DEFINE_LIST_END
@@ -48,6 +50,8 @@
 	.imapc_features = "",
 	.imapc_rawlog_dir = "",
 	.imapc_list_prefix = "",
+	.imapc_max_idle_time = 60*29,
+
 	.ssl_crypto_device = ""
 };
 
--- a/src/lib-storage/index/imapc/imapc-settings.h	Tue Aug 14 03:03:26 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.h	Tue Aug 14 23:09:44 2012 +0300
@@ -23,6 +23,8 @@
 	const char *imapc_features;
 	const char *imapc_rawlog_dir;
 	const char *imapc_list_prefix;
+	unsigned int imapc_max_idle_time;
+
 	const char *ssl_crypto_device;
 
 	enum imapc_features parsed_features;
--- a/src/lib-storage/index/imapc/imapc-storage.c	Tue Aug 14 03:03:26 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Tue Aug 14 23:09:44 2012 +0300
@@ -228,6 +228,7 @@
 		*error_r = "missing imapc_password";
 		return -1;
 	}
+	set.max_idle_time = storage->set->imapc_max_idle_time;
 	set.dns_client_socket_path =
 		*_storage->user->set->base_dir == '\0' ? "" :
 		t_strconcat(_storage->user->set->base_dir, "/",