]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: Make retry count and interval configurable
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 31 Mar 2017 06:44:28 +0000 (09:44 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 3 Apr 2017 19:10:29 +0000 (22:10 +0300)
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

index ba0646b9e6aa31d01c40aa9793fb49adfd7befbd..5c6cae1341c6ec3f45cc006388f6b8e4de60a425 100644 (file)
@@ -45,6 +45,9 @@ imapc_client_init(const struct imapc_client_settings *set)
        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 @@ imapc_client_init(const struct imapc_client_settings *set)
        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 ?
index 8bdbbb2b5a018fc48c1ca3515851307e01065bb5..0df40ef733cd6c2e92a450c53475955fb566acd0 100644 (file)
@@ -92,6 +92,11 @@ struct imapc_client_settings {
 
        /* 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;
index ead05307c8b91b97ed37469fbdd829360c955693..5eca7b92b2c24b47775eb8cb70580095f5676af7 100644 (file)
@@ -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 @@ static bool imapc_connection_can_reconnect(struct imapc_connection *conn)
 {
        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 {
index a837a78471fd9fdb31f363b4b1f65b541392ae6e..56eb17327454e94f47ad0208f48cd5179797344f 100644 (file)
@@ -30,6 +30,8 @@ static const struct setting_define imapc_setting_defines[] = {
        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 @@ static const struct imapc_settings imapc_default_settings = {
        .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 = ""
index c8e7edb529073989c1c975771b486992737230ab..593df6c77243822bb461ce2679c620958384b8ef 100644 (file)
@@ -41,6 +41,8 @@ struct imapc_settings {
        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;
index bc5b1939674805dfa6dfdf12f2c61d873d494b7e..f4c2774389987045ecb93bad6ae9d66f790be4ef 100644 (file)
@@ -304,6 +304,8 @@ int imapc_storage_client_create(struct mail_namespace *ns,
        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' ? "" :