diff options
| author | Zheng Chao <[email protected]> | 2023-01-28 19:30:25 +0800 |
|---|---|---|
| committer | Zheng Chao <[email protected]> | 2023-01-28 19:30:25 +0800 |
| commit | c2ac65ebd53b3b07903133a1f81ed4acd0521f8c (patch) | |
| tree | 9611b6b85452e43d0911b61a182e4b041bcf9974 /src | |
| parent | 35ace83e5ee0368cee3d6a6c2246781a52d2b1c8 (diff) | |
:bug: The log.c should not close stderr, which causes event_base_dispatch() -> epoll_wait() exit, consul_watch_slots_changes_async() failed, Resilience.AddSlotOwner failed, and many other issues.
Diffstat (limited to 'src')
| -rw-r--r-- | src/swarmkv.c | 5 | ||||
| -rw-r--r-- | src/swarmkv_keyspace.c | 10 | ||||
| -rw-r--r-- | src/swarmkv_net.c | 4 |
3 files changed, 11 insertions, 8 deletions
diff --git a/src/swarmkv.c b/src/swarmkv.c index f290dfc..ea30662 100644 --- a/src/swarmkv.c +++ b/src/swarmkv.c @@ -488,7 +488,7 @@ struct swarmkv_cmd_spec *get_spec_by_argv(struct swarmkv *db, size_t argc, char* } -static void libevent_log_cb(int severity, const char *msg) + __attribute__((unused)) static void libevent_log_cb(int severity, const char *msg) { const char *s; FILE *logfile=fopen("libevent_run.log", "a"); @@ -501,6 +501,7 @@ static void libevent_log_cb(int severity, const char *msg) } fprintf(logfile, "[%s] %s\n", s, msg); fclose(logfile); + sleep(1000); } @@ -1151,7 +1152,7 @@ char *swarmkv_get_command_hint(struct swarmkv *db, const char* cmd_name) struct swarmkv *swarmkv_open(struct swarmkv_options *opts, const char *db_name, char **err) { struct swarmkv *db = NULL; - event_set_log_callback(libevent_log_cb); +// event_set_log_callback(libevent_log_cb); db=ALLOC(struct swarmkv, 1); strncpy(db->db_name, db_name, sizeof(db->db_name)); /* adds locking, only required if accessed from separate threads */ diff --git a/src/swarmkv_keyspace.c b/src/swarmkv_keyspace.c index 807135b..5a9f4fb 100644 --- a/src/swarmkv_keyspace.c +++ b/src/swarmkv_keyspace.c @@ -318,7 +318,7 @@ void consul_request_make(struct consul_request *req, enum evhttp_cmd_type cmd, c struct evkeyvalq *output_headers = evhttp_request_get_output_headers(req->evhttpreq); evhttp_add_header(output_headers, "Host", req->ref_client->consul_agent_host); // evhttp_add_header(output_headers, "Connection", "close"); - + evhttp_make_request(req->ref_client->evhttpconn, req->evhttpreq, cmd, url); } @@ -330,6 +330,7 @@ struct consul_client *consul_client_new(const char *host, unsigned short port, s client->logger=logger; client->evbase=evbase; client->evhttpconn=evhttp_connection_base_new(client->evbase, NULL, client->consul_agent_host, client->consul_agent_port); + evhttp_connection_set_timeout(client->evhttpconn, 1800);//set to 30min for blocking query. evhttp_connection_set_closecb(client->evhttpconn, http_request_on_close, client); return client; @@ -382,6 +383,7 @@ struct evhttp* http_server_new(struct event_base* evbase, unsigned int *port_lis } evutil_socket_t sockfd=-1; sockfd=evhttp_bound_socket_get_fd(bound_socket); + evutil_make_socket_closeonexec(sockfd); struct sockaddr_storage ss; ev_socklen_t socklen = sizeof(ss); if (getsockname(sockfd, (struct sockaddr *)&ss, &socklen) < 0) @@ -1208,10 +1210,8 @@ struct swarmkv_module *swarmkv_keyspace_new(struct swarmkv_options *opts, const log_fatal(ks->logger, MODULE_SWARMKV_KEYSPACE, "key slots init failed."); goto error_out; } - //We MUST start watching in different thread than evbase_dispatch(), if not, evhttp_make_request() maybe fail due to socket fd error. - //This happens when calling swarmkv-cli for adding more slot owners. - //I spent two days on this issue, but still don't known what magic design of libevent2 causing this problem. - consul_watch_slots_changes_async(ks); + + consul_watch_slots_changes_async(ks); consul_watch_nodes_changes_async(ks); pthread_create(&(ks->thr), NULL, swarmkv_keyspace_thread, (void *) ks); diff --git a/src/swarmkv_net.c b/src/swarmkv_net.c index 3a6efa5..ddce0ca 100644 --- a/src/swarmkv_net.c +++ b/src/swarmkv_net.c @@ -268,6 +268,7 @@ struct snet_conn *snet_conn_new_by_fd(struct snet_thread *thr, evutil_socket_t f setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes)); // evbuffer_enable_locking(conn->buff_for_sending, NULL); evutil_make_socket_nonblocking(fd); + evutil_make_socket_closeonexec(fd); node_init_from_sockaddr(&conn->connected_from, addr); conn->bev=bufferevent_socket_new(thr->evbase, fd, BEV_OPT_DEFER_CALLBACKS|BEV_OPT_THREADSAFE);//BEV_OPT_UNLOCK_CALLBACKS| @@ -624,6 +625,7 @@ void connect_peer_eventcb(struct bufferevent *bev, short events, void *arg) int yes=1; evutil_socket_t fd=bufferevent_getfd(conn->bev); setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes)); + evutil_make_socket_closeonexec(fd); bufferevent_write_buffer(conn->bev, conn->buff_for_sending); bufferevent_setcb(conn->bev, peer_conn_read_cb, peer_conn_write_cb, peer_conn_event_cb, conn); bufferevent_enable(conn->bev, EV_READ | EV_WRITE); @@ -950,10 +952,10 @@ void swarmkv_net_dispath(struct swarmkv_net *net, int thread_id) struct timeval timer_delay = {2, 0}; net->threads[thread_id].is_dispatching=1; evtimer_add(ev, &timer_delay); + int ret=event_base_dispatch(net->threads[thread_id].evbase); if(net->threads[thread_id].is_dispatching){ log_fatal(net->logger, MODULE_SWAMRKV_NET, "event_base_dispatch() exit abnormally, ret=%d", ret); - sleep(1000); } event_del(ev); event_free(ev); |
