diff options
author | Vijaikumar M <vmallika@redhat.com> | 2014-02-14 20:01:38 +0530 |
---|---|---|
committer | Rajesh Joseph <rjoseph@redhat.com> | 2014-03-03 22:58:23 -0800 |
commit | fe5927b6bd1ed795c9e85996e7c54c3abe36ceba (patch) | |
tree | d69e25c323a4b57c49af8555db75ff65c9690701 /xlators/mgmt/glusterd/src/glusterd-handshake.c | |
parent | 60d4f64cea4752f76b9495bdea255b51d09820ff (diff) |
glusterd/snapshot: store location for snap driven changes
Currently snapshot volfiles are stored at:
<workdir>/vols/<volname>/snaps/<snapvol>
With snap driven approach we need to store the volfiles at:
<workdir>/snaps/<snapname>/<snapvol>
Change-Id: I8efdd5db29833b2b06b64a900cbb4c9b9a5d36b6
Signed-off-by: Vijaikumar M <vmallika@redhat.com>
Signed-off-by: Sachin Pandit <spandit@redhat.com>
Reviewed-on: http://review.gluster.org/7006
Reviewed-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Tested-by: Rajesh Joseph <rjoseph@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-handshake.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 110 |
1 files changed, 50 insertions, 60 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index a1368e211..2fe0d0ee8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -48,15 +48,15 @@ build_volfile_path (const char *volname, char *path, char *vol = NULL; char *dup_volname = NULL; char *free_ptr = NULL; - char *tmp = NULL; - glusterd_volinfo_t *volinfo = NULL; + char *save_ptr = NULL; + char *str_token = NULL; + char *snapname = NULL; + char *snap_volname = NULL; glusterd_volinfo_t *parent_volinfo = NULL; + glusterd_volinfo_t *volinfo = NULL; glusterd_snap_t *snap = NULL; char *server = NULL; gf_boolean_t snap_volume = _gf_false; - char *str = NULL; - char *parent_volname = NULL; - char *input_vol = NULL; priv = THIS->private; @@ -66,53 +66,41 @@ build_volfile_path (const char *volname, char *path, path, path_len); ret = 1; goto out; - } else if ((tmp = strstr (volname, "/snaps/"))) { + } else if ((str_token = strstr (volname, "/snaps/"))) { /* Input volname will have below formats: - <parent_volname>/snaps/<uuid>/<brick_path> - or - <parent_volname>/snaps/snapname - - We need to extract snap uuid from the input volname */ + /snaps/<snapname>/<volname>.<hostname> + or + /snaps/<snapname>/<parent-volname> + We need to extract snapname and parent_volname */ snap_volume = _gf_true; - input_vol = gf_strdup (volname); - if (!input_vol) - goto out; - parent_volname = strtok_r (input_vol, "/", &str); - if (!parent_volname) - goto out; - - str = strrchr (volname, '/'); - if (str) - str++; - tmp = strstr (tmp+1, "/"); - while(*tmp && *tmp == '/') - tmp++; + /*split string by "/" */ + str_token = strtok_r(str_token, "/", &save_ptr); + snapname = strtok_r(NULL, "/", &save_ptr); + snap_volname = strtok_r(NULL, "/", &save_ptr); - /* User has provided snapname from the mountpoint. - Map the snapname to uuid to find the volfile */ - if (tmp == str) { - ret = glusterd_volinfo_find (parent_volname, - &parent_volinfo); + snap = glusterd_find_snap_by_name (snapname); + if (!snap) { + gf_log(THIS->name, GF_LOG_ERROR, "Failed to " + "fetch snap %s", snapname); + ret = -1; + goto out; + } + ret = glusterd_volinfo_find (snap_volname, + &parent_volinfo); + if (ret) { + dup_volname = gf_strdup (snap_volname); + } else { + ret = glusterd_snap_volinfo_find_from_parent_volname + (snap_volname, snap, &volinfo); if (ret) { gf_log(THIS->name, GF_LOG_ERROR, "Failed to " - "find parent volinfo for snap %s", str); - goto out; - } - snap = glusterd_find_snap_by_name (parent_volinfo, str); - if (!snap) { - gf_log(THIS->name, GF_LOG_ERROR, "Failed to " - "fetch snap %s", str); - ret = -1; + "fetch snap volume from parent volname"); goto out; } - dup_volname = gf_strdup (snap->snap_volume->volname); - } else { - dup_volname = gf_strdup (str); + dup_volname = gf_strdup (volinfo->volname); } - str = NULL; - } else if (volname[0] != '/') { /* Normal behavior */ dup_volname = gf_strdup (volname); @@ -132,24 +120,26 @@ build_volfile_path (const char *volname, char *path, if (!snap_volume) { ret = glusterd_volinfo_find (dup_volname, &volinfo); - } else { + } else { ret = 0; - if (snap) - volinfo = snap->snap_volume; - else - ret = glusterd_snap_volinfo_find (dup_volname,&volinfo); + if (!volinfo) + ret = glusterd_snap_volinfo_find (dup_volname, snap, + &volinfo); } if (ret) { /* Split the volume name */ - vol = strtok_r (dup_volname, ".", &tmp); + vol = strtok_r (dup_volname, ".", &save_ptr); if (!vol) goto out; - if (!snap_volume) + + if (!snap_volume) { ret = glusterd_volinfo_find (vol, &volinfo); - else - ret = glusterd_snap_volinfo_find (vol, - &volinfo); + } else { + ret = glusterd_snap_volinfo_find (dup_volname, snap, + &volinfo); + } + if (ret) goto out; } @@ -161,8 +151,9 @@ build_volfile_path (const char *volname, char *path, ret = snprintf (path, path_len, "%s/vols/%s/%s.vol", priv->workdir, volinfo->volname, volname); else - ret = snprintf (path, path_len, "%s/vols/%s.vol", - priv->workdir, volname); + ret = snprintf (path, path_len, "%s/snaps/%s/%s/%s.vol", + priv->workdir, volinfo->snapshot->snapname, + volinfo->volname, snap_volname); if (ret == -1) goto out; @@ -177,8 +168,8 @@ build_volfile_path (const char *volname, char *path, dup_volname); else snprintf (path, path_len, - "%s/vols/%s/snaps/%s/%s%s-fuse.vol", - priv->workdir, parent_volname, volinfo->volname, + "%s/snaps/%s/%s/%s%s-fuse.vol", priv->workdir, + volinfo->snapshot->snapname, volinfo->volname, (trusted_str ? trusted_str:""), dup_volname); ret = stat (path, &stbuf); @@ -190,15 +181,14 @@ build_volfile_path (const char *volname, char *path, priv->workdir, volinfo->volname, volname); else snprintf (path, path_len, - "%s/vols/%s/snaps/%s/%s-tcp.vol", - priv->workdir, parent_volname, - volinfo->volname, volname); + "%s/snaps/%s/%s/%s-tcp.vol", + priv->workdir, volinfo->snapshot->snapname, + volinfo->volname, snap_volname); } ret = 1; out: GF_FREE (free_ptr); - GF_FREE (input_vol); return ret; } |