summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZheng Chao <[email protected]>2023-01-28 19:30:25 +0800
committerZheng Chao <[email protected]>2023-01-28 19:30:25 +0800
commitc2ac65ebd53b3b07903133a1f81ed4acd0521f8c (patch)
tree9611b6b85452e43d0911b61a182e4b041bcf9974 /src
parent35ace83e5ee0368cee3d6a6c2246781a52d2b1c8 (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.c5
-rw-r--r--src/swarmkv_keyspace.c10
-rw-r--r--src/swarmkv_net.c4
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);