changeset 21885:f77c4615bc7c

lib-imap-client: Make retry count and interval configurable
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Fri, 31 Mar 2017 09:44:28 +0300
parents 9c063576224a
children f05cf964db76
files src/lib-imap-client/imapc-client.c 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 6 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-client.c	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-imap-client/imapc-client.c	Fri Mar 31 09:44:28 2017 +0300
@@ -45,6 +45,9 @@
 	const char *error;
 	pool_t pool;
 
+	i_assert(set->connect_retry_count == 0 ||
+		 set->connect_retry_interval_secs > 0);
+
 	pool = pool_alloconly_create("imapc client", 1024);
 	client = p_new(pool, struct imapc_client, 1);
 	client->pool = pool;
@@ -67,6 +70,8 @@
 	client->set.connect_timeout_msecs = set->connect_timeout_msecs != 0 ?
 		set->connect_timeout_msecs :
 		IMAPC_DEFAULT_CONNECT_TIMEOUT_MSECS;
+	client->set.connect_retry_count = set->connect_retry_count;
+	client->set.connect_retry_interval_secs = set->connect_retry_interval_secs;
 	client->set.cmd_timeout_msecs = set->cmd_timeout_msecs != 0 ?
 		set->cmd_timeout_msecs : IMAPC_DEFAULT_COMMAND_TIMEOUT_MSECS;
 	client->set.max_line_length = set->max_line_length != 0 ?
--- a/src/lib-imap-client/imapc-client.h	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-imap-client/imapc-client.h	Fri Mar 31 09:44:28 2017 +0300
@@ -92,6 +92,11 @@
 
 	/* Timeout for logging in. 0 = default. */
 	unsigned int connect_timeout_msecs;
+	/* Number of retries, -1 = infinity */
+	unsigned int connect_retry_count;
+	/* Interval between retries, must be > 0 if retries > 0 */
+	unsigned int connect_retry_interval_secs;
+
 	/* Timeout for IMAP commands. Reset every time more data is being
 	   sent or received. 0 = default. */
 	unsigned int cmd_timeout_msecs;
--- a/src/lib-imap-client/imapc-connection.c	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-imap-client/imapc-connection.c	Fri Mar 31 09:44:28 2017 +0300
@@ -24,7 +24,6 @@
 
 #define IMAPC_COMMAND_STATE_AUTHENTICATE_CONTINUE 10000
 #define IMAPC_MAX_INLINE_LITERAL_SIZE (1024*32)
-#define IMAPC_RECONNECT_MIN_RETRY_SECS 10
 /* If LOGOUT reply takes longer than this, disconnect. */
 #define IMAPC_LOGOUT_TIMEOUT_MSECS 5000
 
@@ -475,6 +474,11 @@
 {
 	if (conn->client->logging_out)
 		return FALSE;
+	if (conn->client->set.connect_retry_count == 0 ||
+	    (conn->client->set.connect_retry_count < UINT_MAX &&
+	     conn->reconnect_count >= conn->client->set.connect_retry_count))
+		return FALSE;
+
 	if (conn->selected_box != NULL)
 		return imapc_client_mailbox_can_reconnect(conn->selected_box);
 	else {
--- a/src/lib-storage/index/imapc/imapc-settings.c	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.c	Fri Mar 31 09:44:28 2017 +0300
@@ -30,6 +30,8 @@
 	DEF(SET_STR, imapc_list_prefix),
 	DEF(SET_TIME, imapc_cmd_timeout),
 	DEF(SET_TIME, imapc_max_idle_time),
+	DEF(SET_UINT, imapc_connection_retry_count),
+	DEF(SET_TIME, imapc_connection_retry_interval_secs),
 	DEF(SET_SIZE, imapc_max_line_length),
 
 	DEF(SET_STR, pop3_deleted_flag),
@@ -54,6 +56,8 @@
 	.imapc_list_prefix = "",
 	.imapc_cmd_timeout = 5*60,
 	.imapc_max_idle_time = 60*29,
+	.imapc_connection_retry_count = 1,
+	.imapc_connection_retry_interval_secs = 10,
 	.imapc_max_line_length = 0,
 
 	.pop3_deleted_flag = ""
--- a/src/lib-storage/index/imapc/imapc-settings.h	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.h	Fri Mar 31 09:44:28 2017 +0300
@@ -41,6 +41,8 @@
 	const char *imapc_list_prefix;
 	unsigned int imapc_cmd_timeout;
 	unsigned int imapc_max_idle_time;
+	unsigned int imapc_connection_retry_count;
+	unsigned int imapc_connection_retry_interval_secs;
 	uoff_t imapc_max_line_length;
 
 	const char *pop3_deleted_flag;
--- a/src/lib-storage/index/imapc/imapc-storage.c	Fri Mar 31 09:59:02 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Fri Mar 31 09:44:28 2017 +0300
@@ -304,6 +304,8 @@
 	set.sasl_mechanisms = imapc_set->imapc_sasl_mechanisms;
 	set.use_proxyauth = (imapc_set->parsed_features & IMAPC_FEATURE_PROXYAUTH) != 0;
 	set.cmd_timeout_msecs = imapc_set->imapc_cmd_timeout * 1000;
+	set.connect_retry_count = imapc_set->imapc_connection_retry_count;
+	set.connect_retry_interval_secs = imapc_set->imapc_connection_retry_interval_secs;
 	set.max_idle_time = imapc_set->imapc_max_idle_time;
 	set.max_line_length = imapc_set->imapc_max_line_length;
 	set.dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" :