diff options
-rwxr-xr-x | tests/basic/volume-snapshot-clone.t | 13 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 54 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 |
5 files changed, 57 insertions, 17 deletions
diff --git a/tests/basic/volume-snapshot-clone.t b/tests/basic/volume-snapshot-clone.t index 7c0ec7e0f5a..5348582a22e 100755 --- a/tests/basic/volume-snapshot-clone.t +++ b/tests/basic/volume-snapshot-clone.t @@ -96,6 +96,19 @@ EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count; EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field ${V0}_clone 'Status'; EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field ${V1}_clone 'Status'; + +TEST $CLI_1 volume stop ${V0}_clone +TEST $CLI_1 volume stop ${V1}_clone + +TEST $CLI_1 volume delete ${V0}_clone +TEST $CLI_1 volume delete ${V1}_clone + +TEST $CLI_1 snapshot clone ${V0}_clone ${V0}_snap +TEST $CLI_1 snapshot clone ${V1}_clone ${V1}_snap + +EXPECT 'Created' volinfo_field ${V0}_clone 'Status'; +EXPECT 'Created' volinfo_field ${V1}_clone 'Status'; + #Clean up stop_force_volumes 2 EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT 'Stopped' volinfo_field $V0 'Status'; diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 6471a9537ba..dc772ca6f51 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -619,7 +619,7 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, /* Create and mount the snap brick */ ret = glusterd_snap_brick_create (snap_vol, brickinfo, - snap_opinfo->brick_num - 1); + snap_opinfo->brick_num - 1, 0); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_CREATION_FAIL, "Failed to " diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h index b964a438623..e0501662b9c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h @@ -137,7 +137,7 @@ glusterd_snap_quorum_check (dict_t *dict, gf_boolean_t snap_volume, int32_t glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, glusterd_brickinfo_t *brickinfo, - int32_t brick_count); + int32_t brick_count, int32_t clone); int glusterd_snapshot_restore_cleanup (dict_t *rsp_dict, diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index dee31563d38..ae70bc81c2c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -2321,6 +2321,7 @@ glusterd_snapshot_clone_prevalidate (dict_t *dict, char **op_errstr, { char *clonename = NULL; char *snapname = NULL; + char device_name[64] = ""; char key[PATH_MAX] = ""; glusterd_snap_t *snap = NULL; char err_str[PATH_MAX] = ""; @@ -2386,10 +2387,12 @@ glusterd_snapshot_clone_prevalidate (dict_t *dict, char **op_errstr, goto out; } + GLUSTERD_GET_UUID_NOHYPHEN (device_name, *snap_volid); + /* Adding snap bricks mount paths to the dict */ ret = glusterd_snap_create_clone_common_prevalidate (rsp_dict, 0, snapname, err_str, - clonename, 1, + device_name, 1, snap_vol, &loglevel, 1, op_errno); @@ -4744,11 +4747,12 @@ out: int32_t glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, glusterd_brickinfo_t *brickinfo, - int32_t brick_count) + int32_t brick_count, int32_t clone) { int32_t ret = -1; xlator_t *this = NULL; char snap_brick_mount_path[PATH_MAX] = ""; + char clone_uuid[64] = ""; struct stat statbuf = {0, }; this = THIS; @@ -4756,9 +4760,16 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, GF_ASSERT (snap_volinfo); GF_ASSERT (brickinfo); - snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), - "%s/%s/brick%d", snap_mount_dir, snap_volinfo->volname, - brick_count + 1); + if (clone) { + GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_volinfo->volume_id); + snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), + "%s/%s/brick%d", snap_mount_dir, + clone_uuid, brick_count + 1); + } else { + snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), + "%s/%s/brick%d", snap_mount_dir, + snap_volinfo->volname, brick_count + 1); + } ret = mkdir_p (snap_brick_mount_path, 0777, _gf_true); if (ret) { @@ -4833,6 +4844,7 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict, char *value = NULL; char *snap_brick_dir = NULL; char snap_brick_path[PATH_MAX] = ""; + char clone_uuid[64] = ""; char *snap_device = NULL; glusterd_brickinfo_t *snap_brickinfo = NULL; gf_boolean_t add_missed_snap = _gf_false; @@ -4948,10 +4960,18 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict, /* Create brick-path in the format /var/run/gluster/snaps/ * * <snap-uuid>/<original-brick#>/snap-brick-dir * */ - snprintf (snap_brick_path, sizeof(snap_brick_path), - "%s/%s/brick%d%s", snap_mount_dir, - snap_vol->volname, brick_count+1, - snap_brick_dir); + if (clone) { + GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_vol->volume_id); + snprintf (snap_brick_path, sizeof(snap_brick_path), + "%s/%s/brick%d%s", snap_mount_dir, + clone_uuid, brick_count+1, + snap_brick_dir); + } else { + snprintf (snap_brick_path, sizeof(snap_brick_path), + "%s/%s/brick%d%s", snap_mount_dir, + snap_vol->volname, brick_count+1, + snap_brick_dir); + } snprintf (key, sizeof(key), "vol%"PRId64".brick_snapdevice%d", volcount, brick_count); @@ -5093,7 +5113,8 @@ out: static int32_t glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol, glusterd_brickinfo_t *brickinfo, - int32_t volcount, int32_t brick_count) + int32_t volcount, int32_t brick_count, + int32_t clone) { char *origin_brick_path = NULL; char key[PATH_MAX] = ""; @@ -5149,7 +5170,8 @@ glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol, } /* create the complete brick here */ - ret = glusterd_snap_brick_create (snap_vol, brickinfo, brick_count); + ret = glusterd_snap_brick_create (snap_vol, brickinfo, + brick_count, clone); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_CREATION_FAIL, "not able to" @@ -6425,7 +6447,8 @@ out: int glusterd_take_brick_snapshot_task (void *opaque) { - int ret = 0; + int ret = 0; + int32_t clone = 0; snap_create_args_t *snap_args = NULL; char *clonename = NULL; char key[PATH_MAX] = ""; @@ -6441,15 +6464,18 @@ glusterd_take_brick_snapshot_task (void *opaque) if (ret) { snprintf (key, sizeof (key), "snap-vol%d.brick%d.status", snap_args->volcount, snap_args->brickorder); - } else + } else { snprintf (key, sizeof (key), "clone%d.brick%d.status", snap_args->volcount, snap_args->brickorder); + clone = 1; + } ret = glusterd_take_brick_snapshot (snap_args->dict, snap_args->snap_vol, snap_args->brickinfo, snap_args->volcount, - snap_args->brickorder); + snap_args->brickorder, + clone); if (ret) { gf_msg (THIS->name, GF_LOG_ERROR, 0, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 333a099faa1..919eed02ec6 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -695,7 +695,8 @@ typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); #define GLUSTERD_GET_UUID_NOHYPHEN(ret_string, uuid) do { \ char *snap_volname_ptr = ret_string; \ - char *snap_volid_ptr = uuid_utoa(uuid); \ + char tmp_uuid[64]; \ + char *snap_volid_ptr = uuid_utoa_r(uuid, tmp_uuid); \ while (*snap_volid_ptr) { \ if (*snap_volid_ptr == '-') { \ snap_volid_ptr++; \ |