!464 use epoll instead of select for wait_exit_fifo
From: @zh_xiaoyu Reviewed-by: @duguhaotian Signed-off-by: @duguhaotian
This commit is contained in:
commit
c7079dfa4f
158
0001-use-epoll-instead-of-select-for-wait_exit_fifo.patch
Normal file
158
0001-use-epoll-instead-of-select-for-wait_exit_fifo.patch
Normal 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
|
||||||
|
|
||||||
10
iSulad.spec
10
iSulad.spec
@ -1,5 +1,5 @@
|
|||||||
%global _version 2.0.17
|
%global _version 2.0.17
|
||||||
%global _release 1
|
%global _release 2
|
||||||
%global is_systemd 1
|
%global is_systemd 1
|
||||||
%global enable_shimv2 1
|
%global enable_shimv2 1
|
||||||
%global is_embedded 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
|
Source: https://gitee.com/openeuler/iSulad/repository/archive/v%{version}.tar.gz
|
||||||
BuildRoot: {_tmppath}/iSulad-%{version}
|
BuildRoot: {_tmppath}/iSulad-%{version}
|
||||||
|
|
||||||
|
Patch0001: 0001-use-epoll-instead-of-select-for-wait_exit_fifo.patch
|
||||||
|
|
||||||
%ifarch x86_64 aarch64
|
%ifarch x86_64 aarch64
|
||||||
Provides: libhttpclient.so()(64bit)
|
Provides: libhttpclient.so()(64bit)
|
||||||
Provides: libisula.so()(64bit)
|
Provides: libisula.so()(64bit)
|
||||||
@ -234,6 +236,12 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%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
|
* Sun Oct 09 2022 zhangxiaoyu <zhangxiaoyu58@huawei.com> - 2.0.17-1
|
||||||
- Type: enhancement
|
- Type: enhancement
|
||||||
- ID: NA
|
- ID: NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user