From 1ea30afa18cbc72b37837ba1b0c4abcd52e7db4e Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Wed, 25 Sep 2013 12:13:28 -0700 Subject: [PATCH] Add delay before retrying IMAP connection; fix #7489 --- .../transport/imap-client-session-manager.vala | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/engine/imap/transport/imap-client-session-manager.vala b/src/engine/imap/transport/imap-client-session-manager.vala index 5a6c8d62..4acc6b79 100644 --- a/src/engine/imap/transport/imap-client-session-manager.vala +++ b/src/engine/imap/transport/imap-client-session-manager.vala @@ -6,6 +6,7 @@ public class Geary.Imap.ClientSessionManager : BaseObject { public const int DEFAULT_MIN_POOL_SIZE = 2; + private const int AUTHORIZED_SESSION_ERROR_RETRY_TIMEOUT_MSEC = 1000; public bool is_open { get; private set; default = false; } @@ -49,6 +50,7 @@ public class Geary.Imap.ClientSessionManager : BaseObject { private Nonblocking.Mutex sessions_mutex = new Nonblocking.Mutex(); private Gee.HashSet reserved_sessions = new Gee.HashSet(); private bool authentication_failed = false; + private uint authorized_session_error_retry_timeout_id = 0; public signal void login_failed(); @@ -159,11 +161,23 @@ public class Geary.Imap.ClientSessionManager : BaseObject { debug("Unable to create authorized session to %s: %s", account_information.get_imap_endpoint().to_string(), err.message); - // try again - adjust_session_pool.begin(); + // try again after a slight delay + if (authorized_session_error_retry_timeout_id != 0) + Source.remove(authorized_session_error_retry_timeout_id); + authorized_session_error_retry_timeout_id + = Timeout.add(AUTHORIZED_SESSION_ERROR_RETRY_TIMEOUT_MSEC, + on_authorized_session_error_retry_timeout); } } + private bool on_authorized_session_error_retry_timeout() { + authorized_session_error_retry_timeout_id = 0; + + adjust_session_pool.begin(); + + return false; + } + // The locked parameter indicates if this is called while the sessions_mutex is locked private async ClientSession create_new_authorized_session(bool locked, Cancellable? cancellable) throws Error {