summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c74
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c32
2 files changed, 68 insertions, 38 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index f4e8ff8977e..e024544d34d 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -1932,14 +1932,17 @@ out:
int32_t
glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol)
{
- char *mnt_pt = NULL;
- struct mntent *entry = NULL;
- struct mntent save_entry = {0,};
- int32_t brick_count = -1;
- int32_t ret = -1;
- glusterd_brickinfo_t *brickinfo = NULL;
- xlator_t *this = NULL;
- char buff [PATH_MAX] = "";
+ char *mnt_pt = NULL;
+ struct mntent *entry = NULL;
+ struct mntent save_entry = {0,};
+ int32_t brick_count = -1;
+ int32_t ret = -1;
+ glusterd_brickinfo_t *brickinfo = NULL;
+ xlator_t *this = NULL;
+ char buff[PATH_MAX] = "";
+ char brick_dir[PATH_MAX] = "";
+ char *tmp = NULL;
+ gf_boolean_t is_brick_dir_present = _gf_false;
this = THIS;
GF_ASSERT (this);
@@ -2021,10 +2024,65 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol)
goto out;
}
+ ret = rmdir (mnt_pt);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "Failed to rmdir: %s, err: %s",
+ mnt_pt, strerror (errno));
+ goto out;
+ }
+
+ /* After removing the brick dir fetch the parent path
+ * i.e /var/run/gluster/snaps/<snap-vol-id>/
+ */
+ if (is_brick_dir_present == _gf_false) {
+ /* Peers not hosting bricks will have _gf_false */
+ is_brick_dir_present = _gf_true;
+
+ /* Need to fetch brick_dir to be removed from
+ * brickinfo->path, as in a restored volume,
+ * snap_vol won't have the non-hyphenated snap_vol_id
+ */
+ tmp = strstr (mnt_pt, "brick");
+ if (!tmp) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "Invalid brick %s", brickinfo->path);
+ ret = -1;
+ goto out;
+ }
+
+ strncpy (brick_dir, mnt_pt, (size_t) (tmp - mnt_pt));
+ }
+
+ GF_FREE (mnt_pt);
+ mnt_pt = NULL;
+ }
+
+ if (is_brick_dir_present == _gf_true) {
+ ret = rmdir (brick_dir);
+ if (ret) {
+ if (errno == ENOTEMPTY) {
+ /* Will occur when multiple glusterds
+ * are running in the same node
+ */
+ gf_log (this->name, GF_LOG_WARNING,
+ "Failed to rmdir: %s, err: %s. "
+ "More than one glusterd running "
+ "on this node.",
+ brick_dir, strerror (errno));
+ ret = 0;
+ goto out;
+ } else
+ gf_log (this->name, GF_LOG_ERROR,
+ "Failed to rmdir: %s, err: %s",
+ brick_dir, strerror (errno));
+ goto out;
+ }
}
ret = 0;
out:
+ GF_FREE (mnt_pt);
gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret);
return ret;
}
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index 790bf9644f6..7efa9fb6d17 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -3034,16 +3034,15 @@ out:
}
static int32_t
-glusterd_store_recreate_brick_mounts (glusterd_volinfo_t *volinfo)
+glusterd_recreate_vol_brick_mounts (xlator_t *this,
+ glusterd_volinfo_t *volinfo)
{
char *brick_mount_path = NULL;
glusterd_brickinfo_t *brickinfo = NULL;
int32_t ret = -1;
int32_t brick_count = -1;
struct stat st_buf = {0, };
- xlator_t *this = NULL;
- this = THIS;
GF_ASSERT (this);
GF_ASSERT (volinfo);
@@ -3896,33 +3895,6 @@ out:
return ret;
}
-static int32_t
-glusterd_recreate_vol_brick_mounts (xlator_t *this,
- glusterd_volinfo_t *volinfo)
-{
- int32_t ret = 0;
- glusterd_conf_t *priv = NULL;
- glusterd_brickinfo_t *brickinfo = NULL;
-
- GF_ASSERT (this);
- priv = this->private;
- GF_ASSERT (priv);
-
- list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
- ret = glusterd_store_recreate_brick_mounts (volinfo);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "Failed to recreate brick mounts "
- "for %s", volinfo->volname);
- goto out;
- }
- }
-
-out:
- gf_log (this->name, GF_LOG_TRACE, "Returning with %d", ret);
- return ret;
-}
-
/* Bricks for snap volumes are hosted at /var/run/gluster/snaps
* When a volume is restored, it points to the bricks of the snap
* volume it was restored from. Hence on a node restart these