index: Do not proceed with init if brick is not mounted

..or else when a volume start force is given, we end up creating
/brick-path/.glusterfs/indices folder and various subdirs under it and
eventually starting the brick process.

As a part of this patch, glusterd_get_index_basepath() is added in
glusterd, who will then use it to create the basepath during
volume-create, add-brick, replace-brick and reset-brick. It also uses this
function to set the 'index-base' xlator option for the index translator.

Change-Id: Id018cf3cb6f1e2e35b5c4cf438d1e939025cb0fc
BUG: 1457202
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: https://review.gluster.org/17426
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
This commit is contained in:
Ravishankar N 2017-06-15 15:36:07 +05:30 committed by Pranith Kumar Karampuri
parent 26ca39ccf0
commit b58a15948f
8 changed files with 59 additions and 4 deletions

View File

@ -23,6 +23,11 @@ echo abc > g
TEST kill_brick $V0 $H0 $B0/${V0}0
rm -rf $B0/${V0}0/.glusterfs $B0/${V0}0/a
#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI
#which will create .glusterfs/indices folder.
mkdir $B0/${V0}0/.glusterfs && chmod 600 $B0/${V0}0/.glusterfs
mkdir $B0/${V0}0/.glusterfs/indices && chmod 600 $B0/${V0}0/.glusterfs/indices
TEST $CLI volume start $V0 force
EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0
#Test that the lookup returns ENOENT instead of ESTALE

View File

@ -39,6 +39,11 @@ TEST kill_brick $V0 $H0 $B0/${V0}-1
TEST rm -rf $B0/${V0}-1/one
TEST rm -rf $B0/${V0}-1/.glusterfs
#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI
#which will create .glusterfs/indices folder.
mkdir $B0/${V0}-1/.glusterfs && chmod 600 $B0/${V0}-1/.glusterfs
mkdir $B0/${V0}-1/.glusterfs/indices && chmod 600 $B0/${V0}-1/.glusterfs/indices
# Start force
TEST $CLI volume start $V0 force

View File

@ -22,6 +22,12 @@ cd $M0/a/b/c
TEST kill_brick $V0 $H0 $B0/${V0}2
rm -rf $B0/${V0}2/*
rm -rf $B0/${V0}2/.glusterfs
#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI
#which will create .glusterfs/indices folder.
mkdir $B0/${V0}2/.glusterfs && chmod 600 $B0/${V0}2/.glusterfs
mkdir $B0/${V0}2/.glusterfs/indices && chmod 600 $B0/${V0}2/.glusterfs/indices
TEST $CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0

View File

@ -76,6 +76,11 @@ volid=$(getfattr -e hex -n trusted.glusterfs.volume-id $B0/${V0}-0 2> /dev/null
| grep = | cut -d= -f2)
rm -rf $B0/${V0}-0;
mkdir $B0/${V0}-0;
#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI
#which will create .glusterfs/indices folder.
mkdir $B0/${V0}-0/.glusterfs && chmod 600 $B0/${V0}-0/.glusterfs
mkdir $B0/${V0}-0/.glusterfs/indices && chmod 600 $B0/${V0}-0/.glusterfs/indices
setfattr -n trusted.glusterfs.volume-id -v $volid $B0/${V0}-0
## Restart and remount. Note that we use actimeo=0 so that the stat calls

View File

@ -2336,6 +2336,14 @@ init (xlator_t *this)
}
GF_OPTION_INIT ("index-base", priv->index_basepath, path, out);
if (gf_lstat_dir (priv->index_basepath, NULL) != 0) {
ret = -1;
gf_msg (this->name, GF_LOG_ERROR, errno,
INDEX_MSG_INDEX_DIR_CREATE_FAILED,
"Failed to find index basepath %s.",
priv->index_basepath);
goto out;
}
GF_OPTION_INIT ("xattrop64-watchlist", watchlist, str, out);
ret = index_make_xattrop_watchlist (this, priv, watchlist,

View File

@ -1339,6 +1339,7 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,
struct stat root_st = {0,};
char msg[2048] = {0,};
gf_boolean_t is_created = _gf_false;
char index_basepath[PATH_MAX] = {0};
ret = sys_mkdir (brickinfo->path, 0777);
if (ret) {
@ -1353,6 +1354,18 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,
is_created = _gf_true;
}
glusterd_get_index_basepath (brickinfo, index_basepath,
sizeof(index_basepath));
ret = mkdir_p (index_basepath, 0600, _gf_true);
if (ret && (errno != EEXIST)) {
snprintf (msg, sizeof (msg), "Failed to create index "
"basepath (%s) for brick %s:%s. Reason : %s ",
index_basepath, brickinfo->hostname,
brickinfo->path, strerror (errno));
goto out;
}
ret = sys_lstat (brickinfo->path, &brick_st);
if (ret) {
snprintf (msg, sizeof (msg), "lstat failed on %s. Reason : %s",
@ -1432,8 +1445,9 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,
ret = 0;
out:
if (ret && is_created)
sys_rmdir (brickinfo->path);
if (ret && is_created) {
recursive_rmdir (brickinfo->path);
}
if (ret && !*op_errstr && msg[0] != '\0')
*op_errstr = gf_strdup (msg);

View File

@ -861,4 +861,15 @@ glusterd_brick_op_prerequisites (dict_t *dict,
int
glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo);
#define INDEX_BASEPATH ".glusterfs/indices"
static inline void
glusterd_get_index_basepath (glusterd_brickinfo_t *brickinfo, char *buffer,
size_t size)
{
if (!buffer)
return;
snprintf (buffer, size, "%s/%s", brickinfo->path, INDEX_BASEPATH);
}
#endif

View File

@ -1978,8 +1978,9 @@ brick_graph_add_index (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
if (!xl)
goto out;
snprintf (index_basepath, sizeof (index_basepath), "%s/%s",
brickinfo->path, ".glusterfs/indices");
glusterd_get_index_basepath (brickinfo, index_basepath,
sizeof(index_basepath));
ret = xlator_set_option (xl, "index-base", index_basepath);
if (ret)
goto out;