diff options
| author | Zheng Chao <[email protected]> | 2023-02-19 18:46:09 +0800 |
|---|---|---|
| committer | Zheng Chao <[email protected]> | 2023-02-19 18:46:09 +0800 |
| commit | a338d8d40555aaee90b0d6334bfc3c64ffa32d06 (patch) | |
| tree | 9e2003eb69540590f3a816acb20a2ff1691a1324 | |
| parent | 58383123290fbb83ee983205b2fe816d118e0f71 (diff) | |
:bug: Fixed crash if consul is not running.v3.0.1
| -rw-r--r-- | src/swarmkv_keyspace.c | 16 |
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); |
