diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 39 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 1 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 24 |
3 files changed, 39 insertions, 25 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 605c4c2519f..aa1201e492d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -379,6 +379,11 @@ glusterd_store_brickinfo_write (int fd, glusterd_brickinfo_t *brickinfo) if (ret) goto out; + ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_REAL_PATH, + brickinfo->path); + if (ret) + goto out; + snprintf (value, sizeof(value), "%d", brickinfo->port); ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_PORT, value); @@ -2305,6 +2310,10 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo) strlen (GLUSTERD_STORE_KEY_BRICK_PATH))) { strncpy (brickinfo->path, value, sizeof (brickinfo->path)); + } else if (!strncmp (key, GLUSTERD_STORE_KEY_BRICK_REAL_PATH, + strlen (GLUSTERD_STORE_KEY_BRICK_REAL_PATH))) { + strncpy (brickinfo->real_path, value, + sizeof (brickinfo->real_path)); } else if (!strncmp (key, GLUSTERD_STORE_KEY_BRICK_PORT, strlen (GLUSTERD_STORE_KEY_BRICK_PORT))) { gf_string2int (value, &brickinfo->port); @@ -2405,8 +2414,8 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo) * snapshot or snapshot restored volume this would be done post * creating the brick mounts */ - if (!volinfo->is_snap_volume && - gf_uuid_is_null (volinfo->restored_from_snap)) { + if (brickinfo->real_path[0] == '\0' && !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 @@ -3300,19 +3309,21 @@ glusterd_recreate_vol_brick_mounts (xlator_t *this, "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; + if (brickinfo->real_path[0] == '\0') { + 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)); } if (brick_mount_path) { diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index 0f4cc9b138b..ec293b64e82 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -85,6 +85,7 @@ typedef enum glusterd_store_ver_ac_{ #define GLUSTERD_STORE_KEY_BRICK_HOSTNAME "hostname" #define GLUSTERD_STORE_KEY_BRICK_PATH "path" +#define GLUSTERD_STORE_KEY_BRICK_REAL_PATH "real_path" #define GLUSTERD_STORE_KEY_BRICK_PORT "listen-port" #define GLUSTERD_STORE_KEY_BRICK_RDMA_PORT "rdma.listen-port" #define GLUSTERD_STORE_KEY_BRICK_DECOMMISSIONED "decommissioned" diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 216089db85a..68208312acb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1109,7 +1109,7 @@ glusterd_brickinfo_new_from_brick (char *brick, strncpy (new_brickinfo->hostname, hostname, 1024); strncpy (new_brickinfo->path, path, 1024); - if (construct_real_path) { + if (construct_real_path && new_brickinfo->real_path[0] == '\0') { if (!realpath (new_brickinfo->path, abspath)) { /* ENOENT indicates that brick path has not been created * which is a valid scenario */ @@ -3169,17 +3169,19 @@ glusterd_import_new_brick (dict_t *peer_data, int32_t vol_count, gf_uuid_parse (brick_uuid_str, new_brickinfo->uuid); if (!gf_uuid_compare(new_brickinfo->uuid, MY_UUID)) { - if (!realpath (new_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", - new_brickinfo->path); - ret = -1; - goto out; + if (new_brickinfo->real_path[0] == '\0') { + if (!realpath (new_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", new_brickinfo->path); + ret = -1; + goto out; + } + strncpy (new_brickinfo->real_path, abspath, + strlen(abspath)); } - strncpy (new_brickinfo->real_path, abspath, - strlen(abspath)); } *brickinfo = new_brickinfo; |