Skip to content

Commit

Permalink
lib-imap-client: Make retry count and interval configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
cmouse authored and sirainen committed Apr 3, 2017
1 parent 8293257 commit 555b4a3
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/lib-imap-client/imapc-client.c
Expand Up @@ -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;
Expand All @@ -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 ?
Expand Down
5 changes: 5 additions & 0 deletions src/lib-imap-client/imapc-client.h
Expand Up @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion src/lib-imap-client/imapc-connection.c
Expand Up @@ -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

Expand Down Expand Up @@ -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 {
Expand Down
4 changes: 4 additions & 0 deletions src/lib-storage/index/imapc/imapc-settings.c
Expand Up @@ -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),
Expand All @@ -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 = ""
Expand Down
2 changes: 2 additions & 0 deletions src/lib-storage/index/imapc/imapc-settings.h
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/lib-storage/index/imapc/imapc-storage.c
Expand Up @@ -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' ? "" :
Expand Down

0 comments on commit 555b4a3

Please sign in to comment.