dovecot-2.2: lib-http: client: Moved delayed failed requests fro...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Oct 12 16:00:18 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/0086d1e38c7a
changeset: 17943:0086d1e38c7a
user: Stephan Bosch <stephan at rename-it.nl>
date: Sun Oct 12 08:58:40 2014 -0700
description:
lib-http: client: Moved delayed failed requests from host to client object.
diffstat:
src/lib-http/http-client-host.c | 59 ---------------------------------
src/lib-http/http-client-private.h | 16 +++++---
src/lib-http/http-client-request.c | 4 +-
src/lib-http/http-client.c | 67 ++++++++++++++++++++++++++++++++++++++
4 files changed, 78 insertions(+), 68 deletions(-)
diffs (254 lines):
diff -r b254b7dc717f -r 0086d1e38c7a src/lib-http/http-client-host.c
--- a/src/lib-http/http-client-host.c Sun Oct 12 08:58:40 2014 -0700
+++ b/src/lib-http/http-client-host.c Sun Oct 12 08:58:40 2014 -0700
@@ -150,7 +150,6 @@
host->client = client;
host->name = i_strdup(hostname);
i_array_init(&host->queues, 4);
- i_array_init(&host->delayed_failing_requests, 1);
hostname = host->name;
hash_table_insert(client->hosts, hostname, host);
@@ -206,7 +205,6 @@
{
struct http_client_host *host = *_host;
struct http_client_queue *const *queue_idx;
- struct http_client_request *req, *const *req_idx;
const char *hostname = host->name;
http_client_host_debug(host, "Host destroy");
@@ -223,64 +221,11 @@
}
array_free(&host->queues);
- while (array_count(&host->delayed_failing_requests) > 0) {
- req_idx = array_idx(&host->delayed_failing_requests, 0);
- req = *req_idx;
-
- i_assert(req->refcount == 1);
- http_client_request_error_delayed(&req);
- }
- array_free(&host->delayed_failing_requests);
-
- if (host->to_failing_requests != NULL)
- timeout_remove(&host->to_failing_requests);
-
i_free(host->ips);
i_free(host->name);
i_free(host);
}
-static void
-http_client_host_handle_request_errors(struct http_client_host *host)
-{
- timeout_remove(&host->to_failing_requests);
-
- while (array_count(&host->delayed_failing_requests) > 0) {
- struct http_client_request *const *req_idx =
- array_idx(&host->delayed_failing_requests, 0);
- struct http_client_request *req = *req_idx;
-
- i_assert(req->refcount == 1);
- http_client_request_error_delayed(&req);
- }
- array_clear(&host->delayed_failing_requests);
-}
-
-void http_client_host_delay_request_error(struct http_client_host *host,
- struct http_client_request *req)
-{
- if (host->to_failing_requests == NULL) {
- host->to_failing_requests = timeout_add_short(0,
- http_client_host_handle_request_errors, host);
- }
- array_append(&host->delayed_failing_requests, &req, 1);
-}
-
-void http_client_host_remove_request_error(struct http_client_host *host,
- struct http_client_request *req)
-{
- struct http_client_request *const *reqs;
- unsigned int i, count;
-
- reqs = array_get(&host->delayed_failing_requests, &count);
- for (i = 0; i < count; i++) {
- if (reqs[i] == req) {
- array_delete(&host->delayed_failing_requests, i, 1);
- return;
- }
- }
-}
-
void http_client_host_switch_ioloop(struct http_client_host *host)
{
struct http_client_queue *const *queue_idx;
@@ -289,8 +234,4 @@
dns_lookup_switch_ioloop(host->dns_lookup);
array_foreach(&host->queues, queue_idx)
http_client_queue_switch_ioloop(*queue_idx);
- if (host->to_failing_requests != NULL) {
- host->to_failing_requests =
- io_loop_move_timeout(&host->to_failing_requests);
- }
}
diff -r b254b7dc717f -r 0086d1e38c7a src/lib-http/http-client-private.h
--- a/src/lib-http/http-client-private.h Sun Oct 12 08:58:40 2014 -0700
+++ b/src/lib-http/http-client-private.h Sun Oct 12 08:58:40 2014 -0700
@@ -220,10 +220,6 @@
unsigned int ips_count;
struct ip_addr *ips;
- /* list of requests in this host that are waiting for ioloop */
- ARRAY(struct http_client_request *) delayed_failing_requests;
- struct timeout *to_failing_requests;
-
/* requests are managed on a per-port basis */
ARRAY_TYPE(http_client_queue) queues;
@@ -239,6 +235,10 @@
struct ioloop *ioloop;
struct ssl_iostream_context *ssl_ctx;
+ /* list of failed requests that are waiting for ioloop */
+ ARRAY(struct http_client_request *) delayed_failing_requests;
+ struct timeout *to_failing_requests;
+
struct connection_list *conn_list;
HASH_TABLE_TYPE(http_client_host) hosts;
@@ -357,11 +357,13 @@
void http_client_host_free(struct http_client_host **_host);
void http_client_host_submit_request(struct http_client_host *host,
struct http_client_request *req);
-void http_client_host_delay_request_error(struct http_client_host *host,
+void http_client_host_switch_ioloop(struct http_client_host *host);
+
+void http_client_delay_request_error(struct http_client *client,
struct http_client_request *req);
-void http_client_host_remove_request_error(struct http_client_host *host,
+void http_client_remove_request_error(struct http_client *client,
struct http_client_request *req);
-void http_client_host_switch_ioloop(struct http_client_host *host);
+
static inline const char *
http_client_peer_addr2str(const struct http_client_peer_addr *addr)
diff -r b254b7dc717f -r 0086d1e38c7a src/lib-http/http-client-request.c
--- a/src/lib-http/http-client-request.c Sun Oct 12 08:58:40 2014 -0700
+++ b/src/lib-http/http-client-request.c Sun Oct 12 08:58:40 2014 -0700
@@ -177,7 +177,7 @@
io_loop_stop(client->ioloop);
if (req->delayed_error != NULL)
- http_client_host_remove_request_error(req->host, req);
+ http_client_remove_request_error(req->client, req);
if (req->payload_input != NULL)
i_stream_unref(&req->payload_input);
if (req->payload_output != NULL)
@@ -910,7 +910,7 @@
i_assert(req->delayed_error == NULL);
req->delayed_error = p_strdup(req->pool, error);
req->delayed_error_status = status;
- http_client_host_delay_request_error(req->host, req);
+ http_client_delay_request_error(req->client, req);
} else {
http_client_request_send_error(req, status, error);
http_client_request_unref(&req);
diff -r b254b7dc717f -r 0086d1e38c7a src/lib-http/http-client.c
--- a/src/lib-http/http-client.c Sun Oct 12 08:58:40 2014 -0700
+++ b/src/lib-http/http-client.c Sun Oct 12 08:58:40 2014 -0700
@@ -137,6 +137,8 @@
client->set.max_auto_retry_delay = set->max_auto_retry_delay;
client->set.debug = set->debug;
+ i_array_init(&client->delayed_failing_requests, 1);
+
client->conn_list = http_client_connection_list_init();
hash_table_create(&client->hosts, default_pool, 0, str_hash, strcmp);
@@ -149,9 +151,23 @@
void http_client_deinit(struct http_client **_client)
{
struct http_client *client = *_client;
+ struct http_client_request *req, *const *req_idx;
struct http_client_host *host;
struct http_client_peer *peer;
+ /* drop delayed failing requests */
+ while (array_count(&client->delayed_failing_requests) > 0) {
+ req_idx = array_idx(&client->delayed_failing_requests, 0);
+ req = *req_idx;
+
+ i_assert(req->refcount == 1);
+ http_client_request_error_delayed(&req);
+ }
+ array_free(&client->delayed_failing_requests);
+
+ if (client->to_failing_requests != NULL)
+ timeout_remove(&client->to_failing_requests);
+
/* free peers */
while (client->peers_list != NULL) {
peer = client->peers_list;
@@ -198,6 +214,12 @@
/* move dns lookups and delayed requests */
for (host = client->hosts_list; host != NULL; host = host->next)
http_client_host_switch_ioloop(host);
+
+ /* move timeouts */
+ if (client->to_failing_requests != NULL) {
+ client->to_failing_requests =
+ io_loop_move_timeout(&client->to_failing_requests);
+ }
}
void http_client_wait(struct http_client *client)
@@ -266,3 +288,48 @@
}
return 0;
}
+
+/*
+ * Delayed request errors
+ */
+
+static void
+http_client_handle_request_errors(struct http_client *client)
+{
+ timeout_remove(&client->to_failing_requests);
+
+ while (array_count(&client->delayed_failing_requests) > 0) {
+ struct http_client_request *const *req_idx =
+ array_idx(&client->delayed_failing_requests, 0);
+ struct http_client_request *req = *req_idx;
+
+ i_assert(req->refcount == 1);
+ http_client_request_error_delayed(&req);
+ }
+ array_clear(&client->delayed_failing_requests);
+}
+
+void http_client_delay_request_error(struct http_client *client,
+ struct http_client_request *req)
+{
+ if (client->to_failing_requests == NULL) {
+ client->to_failing_requests = timeout_add_short(0,
+ http_client_handle_request_errors, client);
+ }
+ array_append(&client->delayed_failing_requests, &req, 1);
+}
+
+void http_client_remove_request_error(struct http_client *client,
+ struct http_client_request *req)
+{
+ struct http_client_request *const *reqs;
+ unsigned int i, count;
+
+ reqs = array_get(&client->delayed_failing_requests, &count);
+ for (i = 0; i < count; i++) {
+ if (reqs[i] == req) {
+ array_delete(&client->delayed_failing_requests, i, 1);
+ return;
+ }
+ }
+}
More information about the dovecot-cvs
mailing list