]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: client: Implemented maximum for connection backoff time.
authorStephan Bosch <stephan@rename-it.nl>
Thu, 23 Oct 2014 02:55:51 +0000 (05:55 +0300)
committerStephan Bosch <stephan@rename-it.nl>
Thu, 23 Oct 2014 02:55:51 +0000 (05:55 +0300)
Without a maximum, the backoff time grows exponentially to enormous values,
because it isn't reset until the connection succeeds. This causes recovery
from connection failures to become very slow. Current maximum is one
minute.

src/lib-http/http-client-peer.c
src/lib-http/http-client-private.h
src/lib-http/http-client.c
src/lib-http/http-client.h

index 769b5350de296890ea823ed4bf75df6e5370d34d..b70a2f7cc41bd8741fc3e05ddcc9535d5897a825 100644 (file)
@@ -592,6 +592,8 @@ void http_client_peer_connection_failure(struct http_client_peer *peer,
                        peer->backoff_time_msecs = set->connect_backoff_time_msecs;
                else
                        peer->backoff_time_msecs *= 2;
+               if (peer->backoff_time_msecs > set->connect_backoff_max_time_msecs)
+                       peer->backoff_time_msecs = set->connect_backoff_max_time_msecs;
        }
 
        if (pending > 1) {
index a9dfe812bec8ba374a0d944769be908e3a7fbd78..4f2582a46270967bc7f1fb397890072467ebf0ba 100644 (file)
@@ -14,6 +14,7 @@
 #define HTTP_CLIENT_CONTINUE_TIMEOUT_MSECS (1000*2)
 #define HTTP_CLIENT_DEFAULT_REQUEST_TIMEOUT_MSECS (1000*60*5)
 #define HTTP_CLIENT_DEFAULT_BACKOFF_TIME_MSECS (100)
+#define HTTP_CLIENT_DEFAULT_BACKOFF_MAX_TIME_MSECS (1000*60)
 
 enum http_response_payload_type;
 
index ad8d67ac95f46db7cbb5621c267790f2de2a61cf..1bda87eb016ff6ff148f4dea880887364fc84ae9 100644 (file)
@@ -125,6 +125,10 @@ struct http_client *http_client_init(const struct http_client_settings *set)
                set->connect_backoff_time_msecs == 0 ?
                        HTTP_CLIENT_DEFAULT_BACKOFF_TIME_MSECS :
                        set->connect_backoff_time_msecs;
+       client->set.connect_backoff_max_time_msecs =
+               set->connect_backoff_max_time_msecs == 0 ?
+                       HTTP_CLIENT_DEFAULT_BACKOFF_MAX_TIME_MSECS :
+                       set->connect_backoff_max_time_msecs;
        client->set.no_auto_redirect = set->no_auto_redirect;
        client->set.no_ssl_tunnel = set->no_ssl_tunnel;
        client->set.max_redirects = set->max_redirects;
index 46c100f6bb8967f72de0a3f8e8e3fc290ee395d1..74371bba97d4d5cf677228b71d43dcc7876d5248 100644 (file)
@@ -95,6 +95,8 @@ struct http_client_settings {
 
        /* Initial backoff time; doubled at each connection failure */
        unsigned int connect_backoff_time_msecs;
+       /* Maximum backoff time */
+       unsigned int connect_backoff_max_time_msecs;
 
        /* response header limits */
        struct http_header_limits response_hdr_limits;