diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-snapshot.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 105 |
1 files changed, 59 insertions, 46 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 4d4b7df673e..68ba4458ebf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -2204,6 +2204,9 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol, char pidfile[PATH_MAX] = {0, }; pid_t pid = -1; int retry_count = 0; + char *mnt_pt = NULL; + struct mntent *entry = NULL; + gf_boolean_t unmount = _gf_true; this = THIS; GF_ASSERT (this); @@ -2228,9 +2231,32 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol, } } + /* Check if the brick is mounted and then try unmounting the brick */ + ret = glusterd_get_brick_root (brickinfo->path, &mnt_pt); + if (ret) { + gf_log (this->name, GF_LOG_WARNING, "Getting the root " + "of the brick for volume %s (snap %s) failed. " + "Removing lv (%s).", snap_vol->volname, + snap_vol->snapshot->snapname, snap_device); + /* The brick path is already unmounted. Remove the lv only * + * Need not fail the operation */ + ret = 0; + unmount = _gf_false; + } + + if ((unmount == _gf_true) && (strcmp (mnt_pt, mount_pt))) { + gf_log (this->name, GF_LOG_WARNING, + "Lvm is not mounted for brick %s:%s. " + "Removing lv (%s).", brickinfo->hostname, + brickinfo->path, snap_device); + /* The brick path is already unmounted. Remove the lv only * + * Need not fail the operation */ + unmount = _gf_false; + } + /* umount cannot be done when the brick process is still in the process of shutdown, so give three re-tries */ - while (retry_count < 3) { + while ((unmount == _gf_true) && (retry_count < 3)) { retry_count++; /*umount2 system call doesn't cleanup mtab entry after un-mount. So use external umount command*/ @@ -2273,8 +2299,6 @@ 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; @@ -2310,7 +2334,19 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol) continue; } - ret = lstat (brickinfo->path, &stbuf); + /* Fetch the brick mount path from the brickinfo->path */ + ret = glusterd_find_brick_mount_path (brickinfo->path, + brick_count + 1, + &brick_mount_path); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to find brick_mount_path for %s", + brickinfo->path); + ret = 0; + continue; + } + + ret = lstat (brick_mount_path, &stbuf); if (ret) { gf_log (this->name, GF_LOG_DEBUG, "Brick %s:%s already deleted.", @@ -2348,54 +2384,36 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol) continue; } - ret = glusterd_get_brick_root (brickinfo->path, &mnt_pt); - if (ret) { - gf_log (this->name, GF_LOG_WARNING, "getting the root " - "of the brick for volume %s (snap %s) failed ", - snap_vol->volname, snap_vol->snapshot->snapname); - continue; + /* Check if the brick has a LV associated with it */ + if (!brickinfo->device_path) { + gf_log (this->name, GF_LOG_DEBUG, + "Brick (%s:%s) does not have a LV " + "associated with it. Removing the brick path", + brickinfo->hostname, brickinfo->path); + goto remove_brick_path; } - /* Fetch the brick mount path from the brickinfo->path */ - ret = glusterd_find_brick_mount_path (brickinfo->path, - brick_count + 1, - &brick_mount_path); + /* Verify if the device path exists or not */ + ret = stat (brickinfo->device_path, &stbuf); if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to find brick_mount_path for %s", - brickinfo->path); - GF_FREE (mnt_pt); - mnt_pt = NULL; - continue; - } - - if (strcmp (mnt_pt, brick_mount_path)) { gf_log (this->name, GF_LOG_DEBUG, - "Lvm is not mounted for brick %s:%s. " - "Removing the brick path.", + "LV (%s) for brick (%s:%s) not present. " + "Removing the brick path", + brickinfo->device_path, brickinfo->hostname, brickinfo->path); - err = -1; /* We need to record this failure */ + /* Making ret = 0 as absence of device path should * + * not fail the remove operation */ + ret = 0; goto remove_brick_path; } - entry = glusterd_get_mnt_entry_info (mnt_pt, buff, - sizeof (buff), &save_entry); - if (!entry) { - gf_log (this->name, GF_LOG_WARNING, "getting the mount" - " entry for the brick %s:%s of the snap %s " - "(volume: %s) failed", brickinfo->hostname, - brickinfo->path, snap_vol->snapshot->snapname, - snap_vol->volname); - err = -1; /* We need to record this failure */ - goto remove_brick_path; - } ret = glusterd_do_lvm_snapshot_remove (snap_vol, brickinfo, - mnt_pt, - entry->mnt_fsname); + brick_mount_path, + brickinfo->device_path); if (ret) { - gf_log (this->name, GF_LOG_ERROR, "failed to " + gf_log (this->name, GF_LOG_ERROR, "Failed to " "remove the snapshot %s (%s)", - brickinfo->path, entry->mnt_fsname); + brickinfo->path, brickinfo->device_path); err = -1; /* We need to record this failure */ } @@ -2412,9 +2430,7 @@ remove_brick_path: if (!tmp) { gf_log (this->name, GF_LOG_ERROR, "Invalid brick %s", brickinfo->path); - GF_FREE (mnt_pt); GF_FREE (brick_mount_path); - mnt_pt = NULL; brick_mount_path = NULL; continue; } @@ -2426,9 +2442,7 @@ remove_brick_path: is_brick_dir_present = _gf_true; } - GF_FREE (mnt_pt); GF_FREE (brick_mount_path); - mnt_pt = NULL; brick_mount_path = NULL; } @@ -2459,7 +2473,6 @@ out: if (err) { ret = err; } - GF_FREE (mnt_pt); GF_FREE (brick_mount_path); gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); return ret; |