From f17ab92e1fe1ba33438068de49ec00d73db50415 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:33:17 +0800 Subject: [PATCH] feat(core): set domain socket to block mode and 1s timeout --- src/adapter/adapter.c | 24 ++++++++++++++++++++++-- src/core/manager.c | 13 ++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index b8d01607..8c4faab7 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -152,18 +152,38 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info, bool load) break; } - adapter->control_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0); + adapter->control_fd = socket(AF_UNIX, SOCK_DGRAM, 0); if (adapter->control_fd <= 0) { free(adapter); return NULL; } - adapter->trans_data_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0); + + adapter->trans_data_fd = socket(AF_UNIX, SOCK_DGRAM, 0); if (adapter->trans_data_fd <= 0) { close(adapter->control_fd); free(adapter); return NULL; } + struct timeval sock_timeout = { + .tv_sec = 1, + .tv_usec = 0, + }; + if (setsockopt(adapter->control_fd, SOL_SOCKET, SO_SNDTIMEO, &sock_timeout, + sizeof(sock_timeout)) < 0 || + setsockopt(adapter->control_fd, SOL_SOCKET, SO_RCVTIMEO, &sock_timeout, + sizeof(sock_timeout)) < 0 || + setsockopt(adapter->trans_data_fd, SOL_SOCKET, SO_SNDTIMEO, + &sock_timeout, sizeof(sock_timeout)) < 0 || + setsockopt(adapter->trans_data_fd, SOL_SOCKET, SO_RCVTIMEO, + &sock_timeout, sizeof(sock_timeout)) < 0) { + nlog_error("fail to set sock timeout for adapter:%s", info->name); + close(adapter->trans_data_fd); + close(adapter->control_fd); + free(adapter); + return NULL; + } + adapter->name = strdup(info->name); adapter->events = neu_event_new(); adapter->state = NEU_NODE_RUNNING_STATE_INIT; diff --git a/src/core/manager.c b/src/core/manager.c index 581c148d..818facdf 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -99,9 +99,20 @@ neu_manager_t *neu_manager_create() manager->subscribe_manager = neu_subscribe_manager_create(); manager->log_level = ZLOG_LEVEL_NOTICE; - manager->server_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0); + manager->server_fd = socket(AF_UNIX, SOCK_DGRAM, 0); assert(manager->server_fd > 0); + struct timeval sock_timeout = { + .tv_sec = 1, + .tv_usec = 0, + }; + if (setsockopt(manager->server_fd, SOL_SOCKET, SO_SNDTIMEO, &sock_timeout, + sizeof(sock_timeout)) < 0 || + setsockopt(manager->server_fd, SOL_SOCKET, SO_RCVTIMEO, &sock_timeout, + sizeof(sock_timeout)) < 0) { + assert(!"fail to set manager sock timeout"); + } + // abstract domain socket is a Linux extension, thus not portable. // use abstract domain socket here to avoid polluting the file system struct sockaddr_un local = {