summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-handshake.c
diff options
context:
space:
mode:
authorVijaikumar M <vmallika@redhat.com>2014-02-14 20:01:38 +0530
committerRajesh Joseph <rjoseph@redhat.com>2014-03-03 22:58:23 -0800
commitfe5927b6bd1ed795c9e85996e7c54c3abe36ceba (patch)
treed69e25c323a4b57c49af8555db75ff65c9690701 /xlators/mgmt/glusterd/src/glusterd-handshake.c
parent60d4f64cea4752f76b9495bdea255b51d09820ff (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.c110
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;
}