diff options
| -rw-r--r-- | tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t | 34 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 58 | 
2 files changed, 76 insertions, 16 deletions
diff --git a/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t new file mode 100644 index 00000000000..68dc0bbe0f7 --- /dev/null +++ b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc +. $(dirname $0)/../../include.rc +cleanup; + +TEST verify_lvm_version +TEST init_n_bricks 1 +TEST setup_lvm 1 + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$L1 +EXPECT 'Created' volinfo_field $V0 'Status' + +TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' + +TEST $CLI snapshot create ${V0}_snap $V0 + +# Simulate a node reboot by unmounting the brick, snap_brick and followed by +# deleting the brick. Now once glusterd restarts, it should be able to construct +# and remount the snap brick +snap_brick=`gluster snap status | grep "Brick Path" | awk -F ":"  '{print $3}'` + +pkill gluster +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $L1 +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $snap_brick +rm -rf $snap_brick + +TEST glusterd +TEST pidof glusterd diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 97f5147dd39..c776e4b5249 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2385,24 +2385,34 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)                         GLUSTERD_ASSIGN_BRICKID_TO_BRICKINFO (brickinfo, volinfo,                                                               brickid++);                  } -                /* By now if the brick is a local brick then it will be able to -                 * resolve which is the only thing we want now for checking -                 * whether the brickinfo->uuid matches with MY_UUID for realpath -                 * check. Hence do not handle error +                /* Populate brickinfo->real_path for normal volumes, for +                 * snapshot or snapshot restored volume this would be done post +                 * creating the brick mounts                   */ -                (void)glusterd_resolve_brick (brickinfo); -                if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) { -                        if (!realpath (brickinfo->path, abspath)) { -                                gf_msg (this->name, GF_LOG_CRITICAL, errno, -                                        GD_MSG_BRICKINFO_CREATE_FAIL, "realpath" -                                        " () failed for brick %s. The " -                                        "underlying file system may be in bad" -                                        " state", brickinfo->path); -                                ret = -1; -                                goto out; +                if (!volinfo->is_snap_volume && +                    gf_uuid_is_null (volinfo->restored_from_snap)) { +                        /* By now if the brick is a local brick then it will be +                         * able to resolve which is the only thing we want now +                         * for checking  whether the brickinfo->uuid matches +                         * with MY_UUID for realpath check. Hence do not handle +                         * error +                         */ +                        (void)glusterd_resolve_brick (brickinfo); +                        if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) { +                                if (!realpath (brickinfo->path, abspath)) { +                                        gf_msg (this->name, GF_LOG_CRITICAL, +                                                errno, +                                                GD_MSG_BRICKINFO_CREATE_FAIL, +                                                "realpath() failed for brick %s" +                                                ". The underlying file system " +                                                "may be in bad state", +                                                brickinfo->path); +                                        ret = -1; +                                        goto out; +                                } +                                strncpy (brickinfo->real_path, abspath, +                                         strlen(abspath));                          } -                        strncpy (brickinfo->real_path, abspath, -                                 strlen(abspath));                  }                  cds_list_add_tail (&brickinfo->brick_list, &volinfo->bricks);                  brick_count++; @@ -3216,6 +3226,7 @@ glusterd_recreate_vol_brick_mounts (xlator_t  *this,          glusterd_brickinfo_t    *brickinfo           = NULL;          int32_t                  ret                 = -1;          struct stat              st_buf              = {0, }; +        char                     abspath[PATH_MAX]   = {0};          GF_ASSERT (this);          GF_ASSERT (volinfo); @@ -3272,6 +3283,21 @@ glusterd_recreate_vol_brick_mounts (xlator_t  *this,                                  GD_MSG_BRK_MNTPATH_MOUNT_FAIL,                                  "Failed to mount brick_mount_path");                  } +                if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) { +                        if (!realpath (brickinfo->path, abspath)) { +                                gf_msg (this->name, GF_LOG_CRITICAL, +                                        errno, +                                        GD_MSG_BRICKINFO_CREATE_FAIL, +                                        "realpath() failed for brick %s" +                                        ". The underlying file system " +                                        "may be in bad state", +                                        brickinfo->path); +                                ret = -1; +                                goto out; +                        } +                        strncpy (brickinfo->real_path, abspath, +                                 strlen(abspath)); +                }                  if (brick_mount_path) {                          GF_FREE (brick_mount_path);  | 
