diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2013-10-23 14:07:29 +0530 |
---|---|---|
committer | Raghavendra Bhat <raghavendra@redhat.com> | 2013-10-23 14:08:45 +0530 |
commit | 846cdf3dfa81bca5160c3b566fdf1ad62d14115b (patch) | |
tree | fc4a6d07e3d2d01a75a8105e27b8eedbd38764ac | |
parent | 9a00042b00e06f547fe59fa9234bbf1d047f1771 (diff) |
mgmt/glusterd: changes to start the brick process of the snap volume
Change-Id: I54db2fa67ebb6b57629f9536c296fbae07a1d159
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 49 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 8 |
3 files changed, 54 insertions, 10 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index cc6744eba..7235f14a7 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -49,6 +49,10 @@ build_volfile_path (const char *volname, char *path, char *tmp = NULL; glusterd_volinfo_t *volinfo = NULL; char *server = NULL; + gf_boolean_t snap_volume = _gf_false; + char *str = NULL; + char *tmp_volname = NULL; + char *input_vol = NULL; priv = THIS->private; @@ -58,6 +62,17 @@ build_volfile_path (const char *volname, char *path, path, path_len); ret = 1; goto out; + } else if (strstr (volname, "/snaps/")) { + input_vol = gf_strdup (volname); + snap_volume = _gf_true; + str = strrchr (volname, '/'); + if (str) + str++; + dup_volname = gf_strdup (str); + str = NULL; + tmp_volname = strtok_r (input_vol, "/", &str); + if (!tmp_volname) + goto out; } else if (volname[0] != '/') { /* Normal behavior */ dup_volname = gf_strdup (volname); @@ -84,28 +99,48 @@ build_volfile_path (const char *volname, char *path, if (!glusterd_auth_get_username (volinfo)) trusted_str = NULL; - ret = snprintf (path, path_len, "%s/vols/%s/%s.vol", - priv->workdir, volinfo->volname, volname); + if (!snap_volume) + ret = snprintf (path, path_len, "%s/vols/%s/%s.vol", + priv->workdir, volinfo->volname, volname); + else + ret = snprintf (path, path_len, "%s/vols/%s/snaps/%s/%s.vol", + priv->workdir, tmp_volname, volinfo->volname, + volname); if (ret == -1) goto out; ret = stat (path, &stbuf); if ((ret == -1) && (errno == ENOENT)) { - snprintf (path, path_len, "%s/vols/%s/%s%s-fuse.vol", - priv->workdir, volinfo->volname, - (trusted_str ? trusted_str : ""), dup_volname); + if (!snap_volume) + snprintf (path, path_len, "%s/vols/%s/%s%s-fuse.vol", + priv->workdir, volinfo->volname, + (trusted_str ? trusted_str : ""), + dup_volname); + else + snprintf (path, path_len, + "%s/vols/%s/snaps/%s/%s%s-fuse.vol", + priv->workdir, tmp_volname, volinfo->volname, + (trusted_str ? trusted_str:""), dup_volname); + ret = stat (path, &stbuf); } if ((ret == -1) && (errno == ENOENT)) { - snprintf (path, path_len, "%s/vols/%s/%s-tcp.vol", - priv->workdir, volinfo->volname, volname); + if (!snap_volume) + snprintf (path, path_len, "%s/vols/%s/%s-tcp.vol", + priv->workdir, volinfo->volname, volname); + else + snprintf (path, path_len, + "%s/vols/%s/snaps/%s/%s-tcp.vol", + priv->workdir, tmp_volname, volinfo->volname, + volname); } ret = 1; out: GF_FREE (free_ptr); + GF_FREE (input_vol); return ret; } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index b18d65bb5..aa6d0b31d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -1925,6 +1925,9 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *name, dict_t *dict, goto out; } + //check whether this is needed or not + list_add_tail (&snap_volume->vol_list, &priv->volumes); + list_for_each_entry (brickinfo, &snap_volume->bricks, brick_list) { ret = glusterd_snap_brick_start (volinfo, snap_volume, brickinfo, _gf_true); @@ -1938,6 +1941,8 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *name, dict_t *dict, } out: + if (ret) + glusterd_volinfo_delete (snap_volume); return ret; } @@ -1978,7 +1983,7 @@ glusterd_do_snap_remove (glusterd_volinfo_t *volinfo, char *name, dict_t *dict) if (snap) { ret = glusterd_brick_snapshot_remove (snap->snap_volume, - volinfo, name); + volinfo, name); if (ret) { gf_log (this->name, GF_LOG_ERROR, "removing the bricks" " snapshots for the snap %s (volume: %s) " diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index e4092249d..ca144e133 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -489,6 +489,9 @@ glusterd_volinfo_dup (glusterd_volinfo_t *volinfo, new_volinfo->nfs_transport_type = volinfo->nfs_transport_type; new_volinfo->brick_count = volinfo->brick_count; + dict_copy (volinfo->dict, new_volinfo->dict); + gd_update_volume_op_versions (new_volinfo); + /* For now, actual volume's username and password itself is used for authentication of trusted clients. If its not working, generate new username and passowd (uuid-generate) and use. @@ -1427,8 +1430,9 @@ glusterd_snap_volume_start_glusterfs (glusterd_volinfo_t *volinfo, runner_argprintf (&runner, "--log-file=%s", valgrind_logfile); } - snprintf (volfile, PATH_MAX, "%s.%s.%s", snap_volinfo->volname, - brickinfo->hostname, exp_path); + snprintf (volfile, PATH_MAX, "%s/snaps/%s/%s.%s.%s", + volinfo->volname, snap_volinfo->volname, + snap_volinfo->volname, brickinfo->hostname, exp_path); if (volinfo->logdir) { snprintf (logfile, PATH_MAX, "%s/%s.log", |