diff options
author | Amar Tumballi <amarts@redhat.com> | 2017-11-03 11:49:42 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2018-03-06 14:41:44 +0000 |
commit | 685d4409f9405a527c87b41d1d89f798729d30f4 (patch) | |
tree | 18d51816cc62a1fad82397ef6b4ff92159d83b97 | |
parent | 51d34907986fba09a560aa18238944811fc47b6a (diff) |
hooks: add a script to stat the subdirs in add-brick
The subdirectories are expected to be present for a subdir
mount to be successful. If not, the client_handshake()
itself fails to succeed. When a volume is about to get
mounted first time, this is easier to handle, as if the
directory is not present in one brick, then its mostly
not present in any other brick. In case of add-brick,
the directory is not present in new brick, and there is
no chance of healing it from the subdirectory mount, as
in those clients, the subdir itself will be 'root' ('/')
of the filesystem. Hence we need a volume mount to heal
the directory before connections can succeed.
This patch does take care of that by healing the directories
which are expected to be mounted as subdirectories from the
volume level mount point.
Change-Id: I2c2ac7b7567fe209aaa720006d09b68584d0dd14
BUG: 1549915
Signed-off-by: Amar Tumballi <amarts@redhat.com>
-rw-r--r-- | extras/hook-scripts/add-brick/post/Makefile.am | 4 | ||||
-rwxr-xr-x | extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh | 86 | ||||
-rw-r--r-- | glusterfs.spec.in | 3 | ||||
-rw-r--r-- | tests/features/subdir-mount.t | 16 |
4 files changed, 94 insertions, 15 deletions
diff --git a/extras/hook-scripts/add-brick/post/Makefile.am b/extras/hook-scripts/add-brick/post/Makefile.am index c1fcf50f05f..bfc0c1cf080 100644 --- a/extras/hook-scripts/add-brick/post/Makefile.am +++ b/extras/hook-scripts/add-brick/post/Makefile.am @@ -1,6 +1,6 @@ -EXTRA_DIST = disabled-quota-root-xattr-heal.sh +EXTRA_DIST = disabled-quota-root-xattr-heal.sh S13create-subdir-mounts.sh hookdir = $(GLUSTERD_WORKDIR)/hooks/1/add-brick/post/ if WITH_SERVER -hook_SCRIPTS = disabled-quota-root-xattr-heal.sh +hook_SCRIPTS = disabled-quota-root-xattr-heal.sh S13create-subdir-mounts.sh endif diff --git a/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh b/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh new file mode 100755 index 00000000000..95e624e3442 --- /dev/null +++ b/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +##--------------------------------------------------------------------------- +## This script runs the self-heal of the directories which are expected to +## be present as they are mounted as subdirectory mounts. +##--------------------------------------------------------------------------- + +MOUNT_DIR=`mktemp -d -t ${0##*/}.XXXXXX`; +OPTSPEC="volname:,go-workdir" +PROGNAME="add-brick-create-subdir" +VOL_NAME=test +GLUSTERD_WORKDIR="/var/lib/glusterd" + +cleanup_mountpoint () +{ + umount -f $MOUNT_DIR; + if [ 0 -ne $? ] + then + return $? + fi + + rmdir $MOUNT_DIR; + if [ 0 -ne $? ] + then + return $? + fi +} + +##------------------------------------------ +## Parse the arguments +##------------------------------------------ +ARGS=$(getopt -l $OPTSPEC -name $PROGNAME $@) +eval set -- "$ARGS" + +while true; +do + case $1 in + --volname) + shift + VOL_NAME=$1 + ;; + --gd-workdir) + shift + GLUSTERD_WORKDIR=$1 + ;; + --version) + shift + ;; + --volume-op) + shift + ;; + *) + shift + break + ;; + esac + shift +done + +## See if we have any subdirs to be healed before going further +subdirs=$(grep 'auth.allow' ${GLUSTERD_WORKDIR}/vols/${VOL_NAME}/info | cut -f2 -d'=' | tr ',' '\n' | cut -f1 -d'('); + +if [ -z ${subdirs} ]; then + rmdir $MOUNT_DIR; + exit 0; +fi + +##---------------------------------------- +## Mount the volume in temp directory. +## ----------------------------------- +glusterfs -s localhost --volfile-id=$VOL_NAME --client-pid=-50 $MOUNT_DIR; +if [ 0 -ne $? ] +then + exit $?; +fi + +## ----------------------------------- +# Do the 'stat' on all the directory for now. Ideal fix is to look at subdir +# list from 'auth.allow' option and only stat them. +for subdir in ${subdirs} +do + stat ${MOUNT_DIR}/${subdir} > /dev/null; +done + +## Clean up and exit +cleanup_mountpoint; diff --git a/glusterfs.spec.in b/glusterfs.spec.in index c147dd9bc2d..d7938c24edd 100644 --- a/glusterfs.spec.in +++ b/glusterfs.spec.in @@ -1377,8 +1377,9 @@ exit 0 %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/disabled-quota-root-xattr-heal.sh - %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre/S28Quota-enable-root-xattr-heal.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/S13create-subdir-mounts.sh %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre/S28Quota-enable-root-xattr-heal.sh %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post/S10selinux-label-brick.sh diff --git a/tests/features/subdir-mount.t b/tests/features/subdir-mount.t index 1742f8655e8..8401946fb0f 100644 --- a/tests/features/subdir-mount.t +++ b/tests/features/subdir-mount.t @@ -98,22 +98,14 @@ TEST test "$mount_inode" == "1" TEST umount $M2 -# because the subdir is not yet 'healed', below should fail. +# Now the exported subdirs should be automatically healed due to +# hook scripts. Check if the mount is successful. TEST $GFS --subdir-mount /subdir2 -s $H0 --volfile-id $V0 $M2 mount_inode=$(stat --format "%i" "$M2") -TEST test "$mount_inode" != "1" - -# Allow the heal to complete -TEST stat $M0/subdir1/subdir1.1/subdir1.2/subdir1.2_file; -TEST stat $M0/subdir2/ - -# Now the mount should succeed -TEST $GFS --subdir-mount /subdir2 -s $H0 --volfile-id $V0 $M1 -TEST stat $M1 +TEST test "$mount_inode" == "1" -# umount $M1 / $M2 TEST umount $M0 -TEST umount $M1 +TEST umount $M2 TEST $CLI volume stop $V0; |