use epoll instead of select for wait_exit_fifo

Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
This commit is contained in:
zhangxiaoyu 2022-10-10 16:14:25 +08:00
parent 6588080f6a
commit 99b8724bea
2 changed files with 167 additions and 1 deletions

View File

@ -0,0 +1,158 @@
From f9cb1b86511fac1c3a7f11fdaa4c9c20dc889068 Mon Sep 17 00:00:00 2001
From: zhangxiaoyu <zhangxiaoyu58@huawei.com>
Date: Sun, 9 Oct 2022 19:00:38 +0800
Subject: [PATCH] use epoll instead of select for wait_exit_fifo
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
---
.../modules/service/service_container.c | 73 ++++++++++++++-----
src/utils/cutils/mainloop.c | 5 ++
src/utils/cutils/mainloop.h | 4 +
3 files changed, 62 insertions(+), 20 deletions(-)
diff --git a/src/daemon/modules/service/service_container.c b/src/daemon/modules/service/service_container.c
index 2f688f57..2b3c8794 100644
--- a/src/daemon/modules/service/service_container.c
+++ b/src/daemon/modules/service/service_container.c
@@ -52,6 +52,7 @@
#include "runtime_api.h"
#include "error.h"
#include "io_handler.h"
+#include "mainloop.h"
#include "constants.h"
#include "event_type.h"
#include "utils_array.h"
@@ -662,37 +663,69 @@ static int verify_mounts(const container_t *cont)
return 0;
}
-static void wait_exit_fifo(const char *id, const int exit_fifo_fd)
+static int wait_exit_fifo_epoll_callback(int fd, uint32_t events, void *cbdata, struct epoll_descr *descr)
{
- int nret = 0;
+ int ret = EPOLL_LOOP_HANDLE_CLOSE;
int exit_code = 0;
- const int WAIT_TIMEOUT = 3;
- fd_set set;
- struct timeval timeout;
+ char *container_id = cbdata;
- FD_ZERO(&set);
- FD_SET(exit_fifo_fd, &set);
+ if (util_read_nointr(fd, &exit_code, sizeof(int)) <= 0) {
+ ERROR("Failed to read exit fifo fd for container %s", container_id);
+ return ret;
+ }
- timeout.tv_sec = WAIT_TIMEOUT;
- timeout.tv_usec = 0;
+ ERROR("The container %s 's monitor on fd %d has exited: %d", container_id, fd, exit_code);
+ return ret;
+}
- nret = select(exit_fifo_fd + 1, &set, NULL, NULL, &timeout);
- if (nret < 0) {
- ERROR("Wait containers %s 's monitor on fd %d error: %s", id, exit_fifo_fd,
- errno ? strerror(errno) : "");
+static void wait_exit_fifo_timeout_callback(void *cbdata)
+{
+ char *container_id = NULL;
+
+ if (cbdata == NULL) {
+ ERROR("Invalid cbdata");
return;
}
+ container_id = (char *)cbdata;
- if (nret == 0) {
- // timeout
- // maybe monitor still cleanup cgroup and processes,
- // or monitor doesn't step in cleanup at all
- ERROR("Wait containers %s 's monitor on fd %d timeout", id, exit_fifo_fd);
+ // timeout
+ // maybe monitor still cleanup cgroup and processes,
+ // or monitor doesn't step in cleanup at all
+ ERROR("Wait container %s 's monitor timeout", container_id);
+}
+
+static void wait_exit_fifo(const char *id, const int exit_fifo_fd)
+{
+ int nret = 0;
+ const int WAIT_TIMEOUT = 3000;
+ char *container_id = NULL;
+ struct epoll_descr descr = { 0 };
+
+ nret = epoll_loop_open(&descr);
+ if (nret != 0) {
+ ERROR("Failed to create epoll for container %s", id);
return;
}
- (void)util_read_nointr(exit_fifo_fd, &exit_code, sizeof(int));
- ERROR("The container %s 's monitor on fd %d has exited: %d", id, exit_fifo_fd, exit_code);
+ container_id = util_strdup_s(id);
+ nret = epoll_loop_add_handler(&descr, exit_fifo_fd, wait_exit_fifo_epoll_callback, container_id);
+ if (nret != 0) {
+ ERROR("Failed to add epoll handler for container %s", id);
+ goto out;
+ }
+
+ descr.timeout_cb = wait_exit_fifo_timeout_callback;
+ descr.timeout_cbdata = container_id;
+ nret = epoll_loop(&descr, WAIT_TIMEOUT);
+ if (nret != 0) {
+ ERROR("Wait container %s 's monitor on fd %d error: %s", id, exit_fifo_fd,
+ errno ? strerror(errno) : "");
+ goto out;
+ }
+
+out:
+ free(container_id);
+ epoll_loop_close(&descr);
}
static int do_start_container(container_t *cont, const char *console_fifos[], bool reset_rm, pid_ppid_info_t *pid_info)
diff --git a/src/utils/cutils/mainloop.c b/src/utils/cutils/mainloop.c
index cf0b41a3..1028087a 100644
--- a/src/utils/cutils/mainloop.c
+++ b/src/utils/cutils/mainloop.c
@@ -56,6 +56,9 @@ int epoll_loop(struct epoll_descr *descr, int t)
}
if (ep_fds == 0 && t != 0) {
+ if (descr->timeout_cb != NULL) {
+ descr->timeout_cb(descr->timeout_cbdata);
+ }
goto out;
}
@@ -139,6 +142,8 @@ int epoll_loop_open(struct epoll_descr *descr)
}
linked_list_init(&(descr->handler_list));
+ descr->timeout_cb = NULL;
+ descr->timeout_cbdata = NULL;
return 0;
}
diff --git a/src/utils/cutils/mainloop.h b/src/utils/cutils/mainloop.h
index b9099a74..5124b33a 100644
--- a/src/utils/cutils/mainloop.h
+++ b/src/utils/cutils/mainloop.h
@@ -18,9 +18,13 @@
#include <stdint.h>
#include "linked_list.h"
+typedef void (*epoll_timeout_callback_t)(void *data);
+
struct epoll_descr {
int fd;
struct linked_list handler_list;
+ epoll_timeout_callback_t timeout_cb;
+ void *timeout_cbdata;
};
#define EPOLL_LOOP_HANDLE_CONTINUE 0
--
2.25.1

View File

@ -1,5 +1,5 @@
%global _version 2.0.17
%global _release 1
%global _release 2
%global is_systemd 1
%global enable_shimv2 1
%global is_embedded 1
@ -13,6 +13,8 @@ URL: https://gitee.com/openeuler/iSulad
Source: https://gitee.com/openeuler/iSulad/repository/archive/v%{version}.tar.gz
BuildRoot: {_tmppath}/iSulad-%{version}
Patch0001: 0001-use-epoll-instead-of-select-for-wait_exit_fifo.patch
%ifarch x86_64 aarch64
Provides: libhttpclient.so()(64bit)
Provides: libisula.so()(64bit)
@ -234,6 +236,12 @@ fi
%endif
%changelog
* Mon Oct 10 2022 zhangxiaoyu <zhangxiaoyu58@huawei.com> - 2.0.17-2
- Type: enhancement
- ID: NA
- SUG: NA
- DESC: use epoll instead of select for wait_exit_fifo
* Sun Oct 09 2022 zhangxiaoyu <zhangxiaoyu58@huawei.com> - 2.0.17-1
- Type: enhancement
- ID: NA