iSulad/0036-modify-resume-task-name.patch
haozi007 e72b756384 iSulad: sync with upstream iSulad
Signed-off-by: haozi007 <liuhao27@huawei.com>
2021-03-23 09:50:40 +08:00

360 lines
13 KiB
Diff

From 4726f2f980f42963a753350aa5306cbe6a4cc668 Mon Sep 17 00:00:00 2001
From: gaohuatao <gaohuatao@huawei.com>
Date: Sat, 20 Feb 2021 09:44:19 +0800
Subject: [PATCH 36/53] modify resume task name
Signed-off-by: gaohuatao <gaohuatao@huawei.com>
---
.../graphdriver/devmapper/deviceset.c | 68 +++++++++++++------
.../graphdriver/devmapper/wrapper_devmapper.c | 57 +++++++++-------
.../graphdriver/devmapper/wrapper_devmapper.h | 2 +-
3 files changed, 81 insertions(+), 46 deletions(-)
diff --git a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
index 2bd3b9c8..0b0394c5 100644
--- a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
+++ b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
@@ -125,7 +125,8 @@ static int devmapper_parse_options(struct device_set *devset, const char **optio
devset->min_free_space_percent = (uint32_t)converted;
} else if (strcasecmp(dup, "dm.basesize") == 0) {
int64_t converted = 0;
- if (util_parse_byte_size_string(val, &converted) != 0) {
+ ret = util_parse_byte_size_string(val, &converted);
+ if (ret != 0) {
ERROR("Invalid size: '%s': %s", val, strerror(-ret));
isulad_set_error_message("Invalid size: '%s': %s", val, strerror(-ret));
ret = -1;
@@ -435,6 +436,11 @@ static image_devmapper_device_info *load_metadata(const struct device_set *devse
goto out;
}
+ if (!util_file_exists(metadata_file)) {
+ ERROR("No such file:%s, need not to load", metadata_file);
+ goto out;
+ }
+
info = image_devmapper_device_info_parse_file(metadata_file, NULL, &err);
if (info == NULL) {
SYSERROR("Load metadata file:%s failed:%s", metadata_file, err);
@@ -594,6 +600,7 @@ static uint64_t get_base_device_size(struct device_set *devset)
device_info = lookup_device(devset, "base");
if (device_info == NULL) {
+ ERROR("No such device:\"base\"");
return 0;
}
@@ -1688,10 +1695,10 @@ out:
(void)deactivate_device(devset, base_info);
}
- if (resume_dev && dev_resume_device(dm_name) != 0) {
- ERROR("devmapper: resume dm with name:%s failed", dm_name);
- ret = -1;
+ if (resume_dev) {
+ dev_resume_device(dm_name);
}
+
free(dm_name);
return ret;
}
@@ -2558,7 +2565,8 @@ static int determine_driver_capabilities(const char *version, struct device_set
goto out;
}
- if (util_parse_byte_size_string(tmp_str[0], &major) != 0) {
+ ret = util_parse_byte_size_string(tmp_str[0], &major);
+ if (ret != 0) {
ERROR("devmapper: invalid size: '%s': %s", tmp_str[0], strerror(-ret));
ret = -1;
goto out;
@@ -2577,7 +2585,8 @@ static int determine_driver_capabilities(const char *version, struct device_set
goto out;
}
- if (util_parse_byte_size_string(tmp_str[1], &minor) != 0) {
+ ret = util_parse_byte_size_string(tmp_str[1], &minor);
+ if (ret != 0) {
ERROR("devmapper: invalid size: '%s': %s", tmp_str[1], strerror(-ret));
ret = -1;
goto out;
@@ -2742,7 +2751,8 @@ static int parse_storage_opt(const json_map_string_string *opts, uint64_t *size)
if (strcasecmp("size", opts->keys[i]) == 0) {
int64_t converted = 0;
- if (util_parse_byte_size_string(opts->values[i], &converted) != 0) {
+ ret = util_parse_byte_size_string(opts->values[i], &converted);
+ if (ret != 0) {
ERROR("Invalid size: '%s': %s", opts->values[i], strerror(-ret));
ret = -1;
goto out;
@@ -2760,6 +2770,31 @@ out:
return ret;
}
+static int grow_device_fs(struct device_set *devset, const char *hash, uint64_t size, uint64_t base_size)
+{
+ int ret = 0;
+ devmapper_device_info_t *device_info = NULL;
+
+ if (size <= base_size) {
+ return 0;
+ } else {
+ DEBUG("devmapper: new fs size is larger than old basesize, start to grow fs");
+ device_info = lookup_device(devset, hash);
+ if (device_info == NULL) {
+ ERROR("devmapper: lookup device %s failed", hash);
+ ret = -1;
+ goto out;
+ }
+
+ if (grow_fs(devset, device_info->info) != 0) {
+ ret = -1;
+ goto out;
+ }
+ }
+out:
+ return ret;
+}
+
int add_device(const char *hash, const char *base_hash, struct device_set *devset,
const json_map_string_string *storage_opts)
{
@@ -2820,18 +2855,14 @@ int add_device(const char *hash, const char *base_hash, struct device_set *devse
goto free_out;
}
- if (size > base_device_info->info->size) {
- DEBUG("devmapper: new fs size is larger than old basesize, start to grow fs");
- device_info = lookup_device(devset, hash);
- if (device_info == NULL) {
- ERROR("devmapper: lookup device %s failed", hash);
- ret = -1;
- goto free_out;
- }
- if (grow_fs(devset, device_info->info) != 0) {
- ret = -1;
- goto free_out;
+ if (grow_device_fs(devset, hash, size, base_device_info->info->size) != 0) {
+ ERROR("Grow new deivce fs failed");
+ // Here, we need to delete device directly instead of deferred deleting, so that we can retry to add device with the same hash successfully.
+ if (do_delete_device(devset, hash, true) != 0) {
+ ERROR("devmapper: remove new snapshot device failed");
}
+ ret = -1;
+ goto free_out;
}
free_out:
@@ -2839,7 +2870,6 @@ free_out:
devmapper_device_info_ref_dec(device_info);
if (pthread_rwlock_unlock(&devset->devmapper_driver_rwlock)) {
ERROR("unlock devmapper conf failed");
- return -1;
}
return ret;
}
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 5748ec54..38ed5615 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
@@ -45,6 +45,9 @@ char *dev_strerror(int errnum)
case ERR_TASK_SET_COOKIE:
errmsg = "Task set cookie error";
break;
+ case ERR_NIL_COOKIE:
+ errmsg = "cookie ptr can't be nil";
+ break;
case ERR_TASK_SET_ADD_NODE:
errmsg = "Task add dm node failed";
break;
@@ -443,6 +446,7 @@ free_out:
int dev_delete_device_force(const char *name)
{
int ret = 0;
+ int nret = 0;
struct dm_task *dmt = NULL;
uint32_t cookie = 0;
@@ -459,8 +463,9 @@ int dev_delete_device_force(const char *name)
goto out;
}
- if (set_cookie(dmt, &cookie, 0) != 0) {
- ERROR("devicemapper: set cookie failed");
+ nret = set_cookie(dmt, &cookie, 0);
+ if (nret != 0) {
+ ERROR("set cookie failed:%s", dev_strerror(nret));
ret = -1;
goto out;
}
@@ -468,7 +473,7 @@ int dev_delete_device_force(const char *name)
g_dm_saw_busy = false;
g_dm_saw_enxio = false;
if (dm_task_run(dmt) != 1) {
- ERROR("devicemapper: run task to delete device faild");
+ ERROR("devicemapper: task run failed");
if (g_dm_saw_busy) {
ERROR("devicemapper: delete task run err type is \"device is busy\"");
ret = ERR_BUSY;
@@ -498,6 +503,7 @@ out:
int dev_remove_device_deferred(const char *name)
{
int ret = 0;
+ int nret = 0;
struct dm_task *dmt = NULL;
uint32_t cookie = 0;
uint16_t flags = DM_UDEV_DISABLE_LIBRARY_FALLBACK;
@@ -521,15 +527,16 @@ int dev_remove_device_deferred(const char *name)
goto out;
}
- if (set_cookie(dmt, &cookie, flags) != 0) {
- ERROR("devicemapper: set cookie failed");
+ nret = set_cookie(dmt, &cookie, flags);
+ if (nret != 0) {
+ ERROR("set cookie failed:%s", dev_strerror(nret));
ret = -1;
goto out;
}
g_dm_saw_enxio = false;
if (dm_task_run(dmt) != 1) {
- ERROR("devicemapper: Error running RemoveDeviceDeferred %d", ret);
+ ERROR("devicemapper: task run failed");
if (g_dm_saw_enxio) {
ERROR("devicemapper: delete deferred task run err type is \"No such device or address\"");
ret = ERR_ENXIO;
@@ -694,7 +701,7 @@ int dev_create_device(const char *pool_fname, int device_id)
} else {
ret = -1;
}
- ERROR("devicemapper: task run failed to create device");
+ ERROR("devicemapper: task run failed");
goto cleanup;
}
@@ -754,7 +761,7 @@ int dev_delete_device(const char *pool_fname, int device_id)
DEBUG("devicemapper: device(id:%d) from pool(%s) does not exist", device_id, pool_fname);
goto cleanup;
}
- ERROR("devicemapper: Error running dev_delete_device");
+ ERROR("devicemapper: task run failed");
ret = -1;
goto cleanup;
}
@@ -786,7 +793,7 @@ int dev_suspend_device(const char *dm_name)
}
if (dm_task_run(dmt) != 1) {
- ERROR("devicemapper: Error running deviceCreate (ActivateDevice)");
+ ERROR("devicemapper: task run failed");
ret = -1;
goto out;
}
@@ -800,34 +807,32 @@ out:
// ResumeDevice is the programmatic example of "dmsetup resume".
// It un-suspends the specified device.
-int dev_resume_device(const char *dm_name)
+void dev_resume_device(const char *dm_name)
{
- int ret = 0;
+ int nret = 0;
uint32_t cookie = 0;
uint16_t flags = 0;
struct dm_task *dmt = NULL;
if (dm_name == NULL) {
ERROR("devicemapper: invalid input params to resume device");
- return -1;
+ return;
}
- dmt = task_create_named(DM_DEVICE_SUSPEND, dm_name);
+ dmt = task_create_named(DM_DEVICE_RESUME, dm_name);
if (dmt == NULL) {
- ERROR("devicemapper:create named task(DM_DEVICE_SUSPEND) failed");
- ret = -1;
+ ERROR("devicemapper: create named task(DM_DEVICE_RESUME) failed");
goto out;
}
- if (set_cookie(dmt, &cookie, flags) != 0) {
- ERROR("devicemapper: Can't set cookie %d", ret);
- ret = -1;
+ nret = set_cookie(dmt, &cookie, flags);
+ if (nret != 0) {
+ ERROR("set cookie failed:%s", dev_strerror(nret));
goto out;
}
if (dm_task_run(dmt) != 1) {
- ERROR("devicemapper: Error running deviceResume %d", ret);
- ret = -1;
+ ERROR("devicemapper: run task of DM_DEVICE_RESUME failed");
}
DEBUG("Start udev wait on resume device");
@@ -837,7 +842,6 @@ out:
if (dmt != NULL) {
dm_task_destroy(dmt);
}
- return ret;
}
int dev_active_device(const char *pool_name, const char *name, int device_id, uint64_t size)
@@ -882,14 +886,15 @@ int dev_active_device(const char *pool_name, const char *name, int device_id, ui
goto out;
}
- if (set_cookie(dmt, &cookie, flags) != 0) {
- ERROR("devicemapper: Can't set cookie");
+ nret = set_cookie(dmt, &cookie, flags);
+ if (nret != 0) {
+ ERROR("set cookie failed:%s", dev_strerror(nret));
ret = -1;
goto out;
}
if (dm_task_run(dmt) != 1) {
- ERROR("devicemapper: error running deviceCreate (ActivateDevice) %d", ret);
+ ERROR("devicemapper: task run failed");
ret = -1;
}
@@ -944,7 +949,7 @@ int dev_cancel_deferred_remove(const char *dm_name)
ret = ERR_ENXIO;
goto cleanup;
}
- ERROR("devicemapper: Error running CancelDeferredRemove");
+ ERROR("devicemapper: task run failed");
ret = -1;
goto cleanup;
}
@@ -1070,7 +1075,7 @@ int dev_create_snap_device_raw(const char *pool_name, int device_id, int base_de
ret = ERR_DEVICE_ID_EXISTS;
goto cleanup;
}
- ERROR("devicemapper: Error running deviceCreate (CreateSnapDeviceRaw)");
+ ERROR("devicemapper: task run failed");
ret = -1;
goto cleanup;
}
diff --git a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
index 0f45a87d..6a45db58 100644
--- a/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
+++ b/src/daemon/modules/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
@@ -119,7 +119,7 @@ int dev_delete_device(const char *pool_fname, int device_id);
int dev_suspend_device(const char *dm_name);
-int dev_resume_device(const char *dm_name);
+void dev_resume_device(const char *dm_name);
int dev_active_device(const char *pool_name, const char *name, int device_id, uint64_t size);
--
2.25.1