提交 b9353240 编写于 作者: G gaohuatao 提交者: lifeng68

devmapper: enable deferred delete in default

Signed-off-by: Ngaohuatao <gaohuatao@huawei.com>
上级 c7024b8d
...@@ -64,8 +64,6 @@ struct device_set { ...@@ -64,8 +64,6 @@ struct device_set {
image_devmapper_transaction *metadata_trans; image_devmapper_transaction *metadata_trans;
bool override_udev_sync_check; bool override_udev_sync_check;
bool deferred_remove;
bool deferred_delete;
char *base_device_uuid; char *base_device_uuid;
char *base_device_filesystem; char *base_device_filesystem;
uint nr_deleted_devices; // number of deleted devices uint nr_deleted_devices; // number of deleted devices
...@@ -73,9 +71,6 @@ struct device_set { ...@@ -73,9 +71,6 @@ struct device_set {
char *xfs_nospace_retries; // max retries when xfs receives ENOSPC char *xfs_nospace_retries; // max retries when xfs receives ENOSPC
int64_t udev_wait_timeout; int64_t udev_wait_timeout;
bool driver_deferred_removal_support;
bool enable_deferred_removal;
bool enable_deferred_deletion;
bool user_base_size; bool user_base_size;
}; };
......
...@@ -174,22 +174,6 @@ out: ...@@ -174,22 +174,6 @@ out:
return 0; return 0;
} }
static int enable_deferred_removal_deletion(struct device_set *devset)
{
if (devset->enable_deferred_removal) {
devset->deferred_remove = true;
}
if (devset->enable_deferred_deletion) {
if (!devset->deferred_remove) {
ERROR("devmapper: Deferred deletion can not be enabled as deferred removal is not enabled.");
return -1;
}
devset->deferred_delete = true;
}
return 0;
}
static char *metadata_dir(struct device_set *devset) static char *metadata_dir(struct device_set *devset)
{ {
char *dir = NULL; char *dir = NULL;
...@@ -297,38 +281,7 @@ out: ...@@ -297,38 +281,7 @@ out:
return dev_name; return dev_name;
} }
static int remove_device(const char *name) static int deactivate_device_mode(struct device_set *devset, image_devmapper_device_info *dev_info)
{
int i = 0;
int max_retry = 200;
int ret = 0;
if (name == NULL) {
ERROR("Invalid input");
return -1;
}
for (; i < max_retry; i++) {
ret = dev_delete_device_force(name);
if (ret == 0) {
DEBUG("devmapper: remove device:%s success", name);
goto out;
}
if (ret != ERR_BUSY) {
ERROR("devmapper: remove device err,cause is not busy,stop retry");
goto out;
}
INFO("devmapper: device is busy so we cannot remove, after 0.1s to retry");
sleep(0.1);
}
out:
return ret;
}
static int deactivate_device_mode(struct device_set *devset, image_devmapper_device_info *dev_info,
bool deferred_remove)
{ {
int ret = 0; int ret = 0;
int nret = 0; int nret = 0;
...@@ -358,28 +311,15 @@ static int deactivate_device_mode(struct device_set *devset, image_devmapper_dev ...@@ -358,28 +311,15 @@ static int deactivate_device_mode(struct device_set *devset, image_devmapper_dev
goto free_out; goto free_out;
} }
if (deferred_remove) { nret = dev_remove_device_deferred(dm_name);
nret = dev_remove_device_deferred(dm_name); if (nret != 0) {
if (nret != 0) { if (nret == ERR_ENXIO) {
if (nret == ERR_ENXIO) { WARN("devmapper: device %s has gone", dm_name);
WARN("devmapper: device %s has gone", dm_name);
goto free_out;
}
ret = -1;
ERROR("devmapper: remove device:%s failed, err:%s", dm_name, dev_strerror(nret));
goto free_out;
}
} else {
nret = remove_device(dm_name);
if (nret != 0) {
if (nret == ERR_ENXIO) {
WARN("devmapper: device %s has gone", dm_name);
goto free_out;
}
ret = -1;
ERROR("devmapper: remove device:%s without deferred failed, err:%s", dm_name, dev_strerror(nret));
goto free_out; goto free_out;
} }
ret = -1;
ERROR("devmapper: remove device:%s failed, err:%s", dm_name, dev_strerror(nret));
goto free_out;
} }
free_out: free_out:
...@@ -389,7 +329,7 @@ free_out: ...@@ -389,7 +329,7 @@ free_out:
static int deactivate_device(struct device_set *devset, image_devmapper_device_info *dev_info) static int deactivate_device(struct device_set *devset, image_devmapper_device_info *dev_info)
{ {
return deactivate_device_mode(devset, dev_info, devset->deferred_remove); return deactivate_device_mode(devset, dev_info);
} }
static int pool_status(struct device_set *devset, uint64_t *total_size_in_sectors, uint64_t *transaction_id, static int pool_status(struct device_set *devset, uint64_t *total_size_in_sectors, uint64_t *transaction_id,
...@@ -1672,27 +1612,24 @@ static int take_snapshot(struct device_set *devset, const char *hash, image_devm ...@@ -1672,27 +1612,24 @@ static int take_snapshot(struct device_set *devset, const char *hash, image_devm
goto out; goto out;
} }
if (devset->deferred_remove) {
if (dev_get_info_with_deferred(dm_name, dmi) != 0) { if (dev_get_info_with_deferred(dm_name, dmi) != 0) {
ret = -1;
goto out;
}
if (dmi->deferred_remove != 0) {
nret = cancel_deferred_removal(devset, base_info->hash);
if (nret != 0) {
if (nret != ERR_ENXIO) {
ret = -1;
goto out;
}
UTIL_FREE_AND_SET_NULL(dmi);
} else {
deactive_dev = true;
}
}
} else if (dev_get_info(dmi, dm_name) != 0) {
ret = -1; ret = -1;
goto out; goto out;
} }
if (dmi->deferred_remove != 0) {
nret = cancel_deferred_removal(devset, base_info->hash);
if (nret != 0) {
if (nret != ERR_ENXIO) {
ret = -1;
goto out;
}
UTIL_FREE_AND_SET_NULL(dmi);
} else {
deactive_dev = true;
}
}
if (dmi != NULL && dmi->exists != 0) { if (dmi != NULL && dmi->exists != 0) {
if (dev_suspend_device(dm_name) != 0) { if (dev_suspend_device(dm_name) != 0) {
...@@ -1728,10 +1665,6 @@ static int cancel_deferred_removal_if_needed(struct device_set *devset, image_de ...@@ -1728,10 +1665,6 @@ static int cancel_deferred_removal_if_needed(struct device_set *devset, image_de
char *dm_name = NULL; char *dm_name = NULL;
struct dm_info dmi = { 0 }; struct dm_info dmi = { 0 };
if (!devset->deferred_remove) {
return 0;
}
dm_name = get_dm_name(devset, info->hash); dm_name = get_dm_name(devset, info->hash);
if (dm_name == NULL) { if (dm_name == NULL) {
ret = -1; ret = -1;
...@@ -1739,7 +1672,6 @@ static int cancel_deferred_removal_if_needed(struct device_set *devset, image_de ...@@ -1739,7 +1672,6 @@ static int cancel_deferred_removal_if_needed(struct device_set *devset, image_de
goto out; goto out;
} }
DEBUG("devmapper: cancelDeferredRemovalIfNeeded START(%s)", dm_name);
if (dev_get_info_with_deferred(dm_name, &dmi) != 0) { if (dev_get_info_with_deferred(dm_name, &dmi) != 0) {
ret = -1; ret = -1;
ERROR("devmapper: can not get info from dm %s", dm_name); ERROR("devmapper: can not get info from dm %s", dm_name);
...@@ -2260,7 +2192,7 @@ static int delete_transaction(struct device_set *devset, image_devmapper_device_ ...@@ -2260,7 +2192,7 @@ static int delete_transaction(struct device_set *devset, image_devmapper_device_
pool_fname = get_pool_dev_name(devset); pool_fname = get_pool_dev_name(devset);
nret = dev_delete_device(pool_fname, info->device_id); nret = dev_delete_device(pool_fname, info->device_id);
if (nret != 0) { if (nret != 0) {
if (sync_delete || !devset->deferred_delete || nret != ERR_BUSY) { if (sync_delete || nret != ERR_BUSY) {
ERROR("devmapper: Error deleting device"); ERROR("devmapper: Error deleting device");
ret = -1; ret = -1;
goto out; goto out;
...@@ -2293,7 +2225,6 @@ out: ...@@ -2293,7 +2225,6 @@ out:
static int do_delete_device(struct device_set *devset, const char *hash, bool sync_delete) static int do_delete_device(struct device_set *devset, const char *hash, bool sync_delete)
{ {
int ret = 0; int ret = 0;
bool deferred_remove = false;
devmapper_device_info_t *device_info = NULL; devmapper_device_info_t *device_info = NULL;
if (devset == NULL || hash == NULL) { if (devset == NULL || hash == NULL) {
...@@ -2306,12 +2237,7 @@ static int do_delete_device(struct device_set *devset, const char *hash, bool sy ...@@ -2306,12 +2237,7 @@ static int do_delete_device(struct device_set *devset, const char *hash, bool sy
return -1; return -1;
} }
deferred_remove = devset->deferred_remove; if (deactivate_device_mode(devset, device_info->info) != 0) {
if (!devset->deferred_delete) {
deferred_remove = false;
}
if (deactivate_device_mode(devset, device_info->info, deferred_remove) != 0) {
ret = -1; ret = -1;
ERROR("devmapper: Error deactivating device"); ERROR("devmapper: Error deactivating device");
goto out; goto out;
...@@ -2505,12 +2431,6 @@ static int do_devmapper_init(struct device_set *devset) ...@@ -2505,12 +2431,6 @@ static int do_devmapper_init(struct device_set *devset)
bool support = false; bool support = false;
char *metadata_path = NULL; char *metadata_path = NULL;
if (enable_deferred_removal_deletion(devset) != 0) {
ERROR("devmapper: enable deferred remove failed");
ret = -1;
goto out;
}
support = udev_set_sync_support(true); support = udev_set_sync_support(true);
if (!support) { if (!support) {
ERROR("devmapper: Udev sync is not supported. This will lead to data loss and unexpected behavior."); ERROR("devmapper: Udev sync is not supported. This will lead to data loss and unexpected behavior.");
...@@ -2597,12 +2517,15 @@ static int determine_driver_capabilities(const char *version, struct device_set ...@@ -2597,12 +2517,15 @@ static int determine_driver_capabilities(const char *version, struct device_set
goto out; goto out;
} }
if (major > 4) { if (major < 4) {
devset->driver_deferred_removal_support = true; ERROR("devicamapper driver version:(%ld.xxx) < 4.27.0, do not surpport deferred removal", major);
isulad_set_error_message("devicamapper driver version:(%ld.xxx) < 4.27.0, do not surpport deferred removal", major);
ret = -1;
goto out; goto out;
} }
if (major < 4) { if (major > 4) {
DEBUG("devicemapper driver version >= 4.27.0, surpport deferred removal");
goto out; goto out;
} }
...@@ -2611,13 +2534,14 @@ static int determine_driver_capabilities(const char *version, struct device_set ...@@ -2611,13 +2534,14 @@ static int determine_driver_capabilities(const char *version, struct device_set
ERROR("devmapper: invalid size: '%s': %s", tmp_str[1], strerror(-ret)); ERROR("devmapper: invalid size: '%s': %s", tmp_str[1], strerror(-ret));
goto out; goto out;
} }
/* /*
* If major is 4 and minor is 27, then there is no need to * If major is 4 and minor is 27, then there is no need to
* check for patch level as it can not be less than 0. * check for patch level as it can not be less than 0.
*/ */
if (minor >= 27) { if (minor < 27) {
devset->driver_deferred_removal_support = true; ERROR("devicamapper driver version (4.%ld) < 4.27.0, , do not surpport deferred removal", minor);
isulad_set_error_message("devicamapper driver version (4.%ld) < 4.27.0, , do not surpport deferred removal", minor);
ret = -1;
goto out; goto out;
} }
...@@ -2644,11 +2568,6 @@ static int devmapper_init_cap_by_version(struct device_set *devset) ...@@ -2644,11 +2568,6 @@ static int devmapper_init_cap_by_version(struct device_set *devset)
goto out; goto out;
} }
if (devset->driver_deferred_removal_support) {
devset->enable_deferred_deletion = true;
devset->enable_deferred_removal = true;
}
out: out:
free(version); free(version);
return ret; return ret;
...@@ -2670,9 +2589,6 @@ static int devmapper_init_devset(const char *driver_home, const char **options, ...@@ -2670,9 +2589,6 @@ static int devmapper_init_devset(const char *driver_home, const char **options,
devset->root = util_strdup_s(driver_home); devset->root = util_strdup_s(driver_home);
devset->user_base_size = false; devset->user_base_size = false;
devset->driver_deferred_removal_support = false;
devset->enable_deferred_removal = false;
devset->enable_deferred_deletion = false;
devset->base_fs_size = 10 * SIZE_GB; devset->base_fs_size = 10 * SIZE_GB;
devset->mkfs_args = NULL; devset->mkfs_args = NULL;
devset->mkfs_args_len = 0; devset->mkfs_args_len = 0;
...@@ -3171,8 +3087,8 @@ struct status *device_set_status(struct device_set *devset) ...@@ -3171,8 +3087,8 @@ struct status *device_set_status(struct device_set *devset)
st->data_file = util_strdup_s(devset->data_device); st->data_file = util_strdup_s(devset->data_device);
st->metadata_file = util_strdup_s(devset->metadata_device); st->metadata_file = util_strdup_s(devset->metadata_device);
st->udev_sync_supported = udev_sync_supported(); st->udev_sync_supported = udev_sync_supported();
st->deferred_remove_enabled = devset->deferred_remove; st->deferred_remove_enabled = true;
st->deferred_delete_enabled = devset->deferred_delete; st->deferred_delete_enabled = true;
st->deferred_deleted_device_count = devset->nr_deleted_devices; st->deferred_deleted_device_count = devset->nr_deleted_devices;
st->base_device_size = get_base_device_size(devset); st->base_device_size = get_base_device_size(devset);
st->base_device_fs = util_strdup_s(devset->base_device_filesystem); st->base_device_fs = util_strdup_s(devset->base_device_filesystem);
......
...@@ -281,11 +281,6 @@ static void free_driver_mount_opts(struct driver_mount_opts *opts) ...@@ -281,11 +281,6 @@ static void free_driver_mount_opts(struct driver_mount_opts *opts)
free(opts); free(opts);
} }
bool devmapper_layer_exists(const char *id, const struct graphdriver *driver)
{
return has_device(id, driver->devset);
}
int devmapper_apply_diff(const char *id, const struct graphdriver *driver, const struct io_read_wrapper *content) int devmapper_apply_diff(const char *id, const struct graphdriver *driver, const struct io_read_wrapper *content)
{ {
struct driver_mount_opts *mount_opts = NULL; struct driver_mount_opts *mount_opts = NULL;
......
...@@ -57,8 +57,6 @@ char *devmapper_mount_layer(const char *id, const struct graphdriver *driver, ...@@ -57,8 +57,6 @@ char *devmapper_mount_layer(const char *id, const struct graphdriver *driver,
int devmapper_umount_layer(const char *id, const struct graphdriver *driver); int devmapper_umount_layer(const char *id, const struct graphdriver *driver);
bool devmapper_layer_exists(const char *id, const struct graphdriver *driver);
int devmapper_apply_diff(const char *id, const struct graphdriver *driver, const struct io_read_wrapper *content); int devmapper_apply_diff(const char *id, const struct graphdriver *driver, const struct io_read_wrapper *content);
int devmapper_get_layer_metadata(const char *id, const struct graphdriver *driver, json_map_string_string *map_info); int devmapper_get_layer_metadata(const char *id, const struct graphdriver *driver, json_map_string_string *map_info);
......
...@@ -64,7 +64,6 @@ static const struct graphdriver_ops g_devmapper_ops = { ...@@ -64,7 +64,6 @@ static const struct graphdriver_ops g_devmapper_ops = {
.rm_layer = devmapper_rm_layer, .rm_layer = devmapper_rm_layer,
.mount_layer = devmapper_mount_layer, .mount_layer = devmapper_mount_layer,
.umount_layer = devmapper_umount_layer, .umount_layer = devmapper_umount_layer,
.exists = devmapper_layer_exists,
.apply_diff = devmapper_apply_diff, .apply_diff = devmapper_apply_diff,
.get_layer_metadata = devmapper_get_layer_metadata, .get_layer_metadata = devmapper_get_layer_metadata,
.get_driver_status = devmapper_get_driver_status, .get_driver_status = devmapper_get_driver_status,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册