135 lines
4.7 KiB
Diff
135 lines
4.7 KiB
Diff
|
|
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 2/9] 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
|
||
|
|
|