iSulad/0007-Delete-meaningless-thread-creation-and-ensure-the-ta.patch
zhangxiaoyu 0fe88d116c upgrade from upstream
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
(cherry picked from commit d5491fea9ae065ee392984598d2f8cfeafb44a62)
2023-02-22 15:59:30 +08:00

200 lines
6.3 KiB
Diff

From 8ac6ba83be4514b94132748428cef0bbef7726d7 Mon Sep 17 00:00:00 2001
From: zhongtao <zhongtao17@huawei.com>
Date: Sun, 29 Jan 2023 15:48:07 +0800
Subject: [PATCH 07/19] Delete meaningless thread creation and ensure the
task_console_accept thread ends before destroying the io_thread
Signed-off-by: zhongtao <zhongtao17@huawei.com>
---
src/cmd/isulad-shim/main.c | 5 ++--
src/cmd/isulad-shim/process.c | 52 ++++++++++++++++++++++-------------
src/cmd/isulad-shim/process.h | 4 +--
3 files changed, 38 insertions(+), 23 deletions(-)
diff --git a/src/cmd/isulad-shim/main.c b/src/cmd/isulad-shim/main.c
index 3ab22d86..eedd8fda 100644
--- a/src/cmd/isulad-shim/main.c
+++ b/src/cmd/isulad-shim/main.c
@@ -98,6 +98,7 @@ int main(int argc, char **argv)
int ret = SHIM_ERR;
int efd = -1;
process_t *p = NULL;
+ pthread_t tid_accept;
g_log_fd = open_no_inherit(SHIM_LOG_NAME, O_CREAT | O_WRONLY | O_APPEND | O_SYNC, 0640);
if (g_log_fd < 0) {
@@ -151,7 +152,7 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
- ret = open_io(p);
+ ret = open_io(p, &tid_accept);
if (ret != SHIM_OK) {
exit(EXIT_FAILURE);
}
@@ -166,5 +167,5 @@ int main(int argc, char **argv)
released_timeout_exit();
- return process_signal_handle_routine(p);
+ return process_signal_handle_routine(p, tid_accept);
}
diff --git a/src/cmd/isulad-shim/process.c b/src/cmd/isulad-shim/process.c
index 92dd2701..66c604f3 100644
--- a/src/cmd/isulad-shim/process.c
+++ b/src/cmd/isulad-shim/process.c
@@ -423,6 +423,14 @@ static int start_io_copy_threads(process_t *p)
/* 4 threads for stdin, stdout, stderr and exec resize */
for (i = 0; i < 4; i++) {
+ /*
+ * if the terminal is used, we do not need to active the io copy of stderr pipe,
+ * for stderr and stdout are mixed together
+ */
+ if (i == STDID_ERR && p->state->terminal) {
+ continue;
+ }
+
ret = create_io_copy_thread(p, i);
if (ret != SHIM_OK) {
return SHIM_ERR;
@@ -512,11 +520,6 @@ static void *task_console_accept(void *data)
int ret = SHIM_ERR;
console_accept_t *ac = (console_accept_t *)data;
- if ((pthread_detach(pthread_self())) != 0) {
- write_message(g_log_fd, ERR_MSG, "detach thread failed");
- return NULL;
- }
-
conn_fd = accept(ac->listen_fd, NULL, NULL);
if (conn_fd < 0) {
write_message(g_log_fd, ERR_MSG, "accept from fd %d failed:%d", ac->listen_fd, SHIM_SYS_ERR(errno));
@@ -549,12 +552,6 @@ static void *task_console_accept(void *data)
goto out;
}
- /*
- * if the terminal is used, we do not need to active the io copy of stderr pipe,
- * for stderr and stdout are mixed together
- */
- destroy_io_thread(ac->p, STDID_ERR);
-
out:
/* release listen socket at the first time */
close_fd(&ac->listen_fd);
@@ -634,7 +631,7 @@ static int new_temp_console_path(process_t *p)
return SHIM_OK;
}
-static int console_init(process_t *p)
+static int console_init(process_t *p, pthread_t *tid_accept)
{
int ret = SHIM_ERR;
int fd = -1;
@@ -670,8 +667,7 @@ static int console_init(process_t *p)
ac->p = p;
ac->listen_fd = fd;
- pthread_t tid_accept;
- ret = pthread_create(&tid_accept, NULL, task_console_accept, ac);
+ ret = pthread_create(tid_accept, NULL, task_console_accept, ac);
if (ret != SHIM_OK) {
goto failure;
}
@@ -762,7 +758,7 @@ failure:
return NULL;
}
-static int open_terminal_io(process_t *p)
+static int open_terminal_io(process_t *p, pthread_t *tid_accept)
{
int ret = SHIM_ERR;
@@ -773,7 +769,7 @@ static int open_terminal_io(process_t *p)
}
/* begin listen and accept fd from p->console_sock_path */
- return console_init(p);
+ return console_init(p, tid_accept);
}
static int open_generic_io(process_t *p)
@@ -916,7 +912,7 @@ failure:
return NULL;
}
-int open_io(process_t *p)
+int open_io(process_t *p, pthread_t *tid_accept)
{
int ret = SHIM_ERR;
@@ -926,7 +922,7 @@ int open_io(process_t *p)
}
if (p->state->terminal) {
- return open_terminal_io(p);
+ return open_terminal_io(p, tid_accept);
}
return open_generic_io(p);
@@ -1216,12 +1212,13 @@ static int try_wait_all_child(void) {
return 1;
}
-int process_signal_handle_routine(process_t *p)
+int process_signal_handle_routine(process_t *p, const pthread_t tid_accept)
{
int ret = SHIM_ERR;
bool exit_shim = false;
int nret = 0;
int i;
+ struct timespec ts;
for (;;) {
int status;
@@ -1257,6 +1254,23 @@ int process_signal_handle_routine(process_t *p)
if (p->exit_fd > 0) {
(void)write_nointr(p->exit_fd, &status, sizeof(int));
}
+ // wait for task_console_accept thread termination. In order to make sure that
+ // the io_copy connection is established and io_thread is not used by multiple threads.
+ if (p->state->terminal) {
+ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
+ write_message(g_log_fd, ERR_MSG, "Failed to get realtime");
+ nret = pthread_join(tid_accept, NULL);
+ } else {
+ // Set the maximum waiting time to 60s to prevent stuck.
+ ts.tv_sec += 60;
+ nret = pthread_timedjoin_np(tid_accept, NULL, &ts);
+ }
+
+ if (nret != 0) {
+ write_message(g_log_fd, ERR_MSG, "Failed to join task_console_accept thread");
+ }
+ }
+
for (i = 0; i < 3; i++) {
destroy_io_thread(p, i);
}
diff --git a/src/cmd/isulad-shim/process.h b/src/cmd/isulad-shim/process.h
index 11d1bf64..66820f68 100644
--- a/src/cmd/isulad-shim/process.h
+++ b/src/cmd/isulad-shim/process.h
@@ -94,10 +94,10 @@ typedef struct {
process_t* new_process(char *id, char *bundle, char *runtime);
-int open_io(process_t *p);
+int open_io(process_t *p, pthread_t *tid_accept);
int process_io_init(process_t *p);
int create_process(process_t *p);
-int process_signal_handle_routine(process_t *p);
+int process_signal_handle_routine(process_t *p, const pthread_t tid_accept);
#ifdef __cplusplus
}
--
2.25.1