summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZheng Chao <[email protected]>2023-02-19 18:46:09 +0800
committerZheng Chao <[email protected]>2023-02-19 18:46:09 +0800
commita338d8d40555aaee90b0d6334bfc3c64ffa32d06 (patch)
tree9e2003eb69540590f3a816acb20a2ff1691a1324
parent58383123290fbb83ee983205b2fe816d118e0f71 (diff)
:bug: Fixed crash if consul is not running.v3.0.1
-rw-r--r--src/swarmkv_keyspace.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/swarmkv_keyspace.c b/src/swarmkv_keyspace.c
index 67e6b37..e17a445 100644
--- a/src/swarmkv_keyspace.c
+++ b/src/swarmkv_keyspace.c
@@ -264,6 +264,7 @@ struct consul_client
struct consul_request *request_table;
};
void consul_request_callback(struct evhttp_request *evhttpreq, void *arg);
+void consul_request_error_callback(enum evhttp_request_error error, void *arg);
struct consul_request *consul_request_new(struct consul_client *client, const char *symbol, struct future *f)
{
struct consul_request *req=ALLOC(struct consul_request, 1);
@@ -273,6 +274,7 @@ struct consul_request *consul_request_new(struct consul_client *client, const ch
req->f=f;
req->ref_client=client;
req->request_id=client->req_id_generator++;
+ evhttp_request_set_error_cb(req->evhttpreq, consul_request_error_callback);
req->evhttpconn=evhttp_connection_base_new(client->evbase, NULL, client->consul_agent_host, client->consul_agent_port);
@@ -295,6 +297,13 @@ void consul_request_free(struct consul_request *req)
free(req);
}
+void consul_request_error_callback(enum evhttp_request_error error, void *arg)
+{
+ struct consul_request *req=(struct consul_request *)arg;
+ struct promise *p=future_to_promise(req->f);
+ promise_failed(p, FUTURE_ERROR_EXCEPTION, "consul request error");
+ consul_request_free(req);
+}
void consul_request_callback(struct evhttp_request *evhttpreq, void *arg)
{
struct consul_request *req=(struct consul_request *)arg;
@@ -309,9 +318,10 @@ void consul_request_callback(struct evhttp_request *evhttpreq, void *arg)
evutil_socket_error_to_string(errcode));
promise_failed(p, FUTURE_ERROR_EXCEPTION, "socket error");
}
-
- promise_success(p, evhttpreq);
-
+ else
+ {
+ promise_success(p, evhttpreq);
+ }
//The request should be freed automatically after the http_request_done has finished executing.
req->evhttpreq=NULL;
consul_request_free(req);