iSulad/0002-devmapper-fix-udev-wait-thread-resource-leak.patch

135 lines
4.7 KiB
Diff
Raw Normal View History

From 025416aae9f7eaaa8fe5ad52ecbbf6692505186b Mon Sep 17 00:00:00 2001
From: gaohuatao <gaohuatao@huawei.com>
Date: Thu, 31 Dec 2020 14:31:12 +0800
Subject: [PATCH 02/53] devmapper: fix udev wait thread resource leak
Signed-off-by: gaohuatao <gaohuatao@huawei.com>
---
.../graphdriver/devmapper/driver_devmapper.c | 2 +-
.../graphdriver/devmapper/wrapper_devmapper.c | 35 +++++++++++--------
2 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c
index ab60845d..f2586f0d 100644
--- a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c
+++ b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c
@@ -216,7 +216,7 @@ char *devmapper_mount_layer(const char *id, const struct graphdriver *driver,
}
if (mount_device(id, mnt_point_dir, mount_opts, driver->devset) != 0) {
- ERROR("Mount device:%s to path:%s failed", id, mnt_parent_dir);
+ ERROR("Mount device:%s to path:%s failed", id, mnt_point_dir);
ret = -1;
goto out;
}
diff --git a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
index 112e2b73..1dcdf595 100644
--- a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
+++ b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
@@ -358,28 +358,32 @@ out:
static void *udev_wait_process(void *data)
{
+ int ret = 0;
udev_wait_pth_t *uwait = (udev_wait_pth_t *)data;
- if (dm_udev_wait(uwait->cookie) != 1) {
- pthread_mutex_lock(&uwait->udev_mutex);
- uwait->state = ERR_UDEV_WAIT;
- pthread_mutex_unlock(&uwait->udev_mutex);
- DAEMON_CLEAR_ERRMSG();
- pthread_exit((void *)ERR_UDEV_WAIT);
+ if (pthread_detach(pthread_self()) != 0) {
+ CRIT("Start: set thread detach fail");
+ goto out;
}
+ ret = dm_udev_wait(uwait->cookie);
pthread_mutex_lock(&uwait->udev_mutex);
- uwait->state = DEV_OK;
+ if (ret != 1) {
+ uwait->state = ERR_UDEV_WAIT;
+ } else {
+ uwait->state = DEV_OK;
+ }
pthread_mutex_unlock(&uwait->udev_mutex);
+
+out:
DAEMON_CLEAR_ERRMSG();
- pthread_exit((void *)0);
+ return NULL;
}
// UdevWait waits for any processes that are waiting for udev to complete the specified cookie.
void dev_udev_wait(uint32_t cookie)
{
pthread_t tid;
- int thread_result = 0;
udev_wait_pth_t *uwait = NULL;
float timeout = 0;
struct timeval start, end;
@@ -403,7 +407,7 @@ void dev_udev_wait(uint32_t cookie)
}
if (pthread_create(&tid, NULL, udev_wait_process, uwait) != 0) {
- ERROR("devmapper: create udev wait process thread failed");
+ ERROR("devmapper: create udev wait process thread error:%s", strerror(errno));
goto free_out;
}
@@ -419,15 +423,14 @@ void dev_udev_wait(uint32_t cookie)
ERROR("devmapper: get time failed");
goto free_out;
}
+
timeout = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000; // seconds
if (timeout >= (float)dm_udev_wait_timeout) {
if (dm_udev_complete(cookie) != 1) {
ERROR("Failed to complete udev cookie %u on udev wait timeout", cookie);
goto free_out;
}
- INFO("devmapper: udev wait join thread start...");
- pthread_join(tid, (void *)&thread_result);
- INFO("devmapper: udev wait join thread end exit %d", thread_result);
+ ERROR("Wait on udev cookie time out");
break;
}
}
@@ -482,6 +485,7 @@ int dev_delete_device_force(const char *name)
}
udev:
+ DEBUG("Start udev wait on delete device force");
dev_udev_wait(cookie);
out:
@@ -536,6 +540,7 @@ int dev_remove_device_deferred(const char *name)
}
udev:
+ DEBUG("Start udev wait on remove device deferred");
dev_udev_wait(cookie);
out:
if (dmt != NULL) {
@@ -825,6 +830,7 @@ int dev_resume_device(const char *dm_name)
ret = -1;
}
+ DEBUG("Start udev wait on resume device");
dev_udev_wait(cookie);
out:
@@ -886,7 +892,8 @@ int dev_active_device(const char *pool_name, const char *name, int device_id, ui
ERROR("devicemapper: error running deviceCreate (ActivateDevice) %d", ret);
ret = -1;
}
-
+
+ DEBUG("Start udev wait on create device");
dev_udev_wait(cookie);
out:
if (dmt != NULL) {
--
2.25.1