glusterfs/tests/bugs/bug-904065.t
Niels de Vos bbefeffafe nfs: persistent caching of connected NFS-clients
Introduce /var/lib/glusterfs/nfs/rmtab to contain a list of NFS-clients
which have a volume mounted. The volume option 'nfs.mount-rmtab' can be
set to an alternative filename. When the file is located on shared
storage, multiple gNFS servers can use the same file to present a single
NFS-server.

This cache is read when a system administrator calls 'showmount -a' and
updated when an NFS-client calls MNT or UMNT from the MOUNT protocol.

Usage:
- create a volume for storing the shared rmtab file
- mount the volume on all storage servers, at the same location
- make sure that the volume is mounted at boot (add to /etc/fstab)
- place the rmtab file on the volume:
   # gluster volume set <VOLUME> nfs.mount-rmtab <MOUNTPOINT>/<FILENAME>
- any subsequent mount requests will add an entry to this file
- 'showmount -a' requests will return the NFS-clients using the cluster

Note:
The NFS-server does currently not support reconfigure(). When a
configuration option is set/changed, the NFS-server glusterfs process
gets restarted. This causes the active NFS-clients to be forgotten (the
entries are saved in the old rmtab, but we do not have a reference to
that file any more, so we can't re-add them). Therefor a re-mount done
by the NFS-clients is needed before they get listed in the rmtab again.

Change-Id: I58f47135d60ad112849d647bea4e1129683dd2b3
BUG: 904065
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: http://review.gluster.org/4430
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Harshavardhana <harsha@harshavardhana.net>
Tested-by: Harshavardhana <harsha@harshavardhana.net>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
2013-08-28 06:54:44 -07:00

91 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
#
# This test does not use 'showmount' from the nfs-utils package, it would
# require setting up a portmapper (either rpcbind or portmap, depending on the
# Linux distribution used for testing). The persistancy of the rmtab should not
# affect the current showmount outputs, so existing regression tests should be
# sufficient.
#
# count the lines of a file, return 0 if the file does not exist
function count_lines()
{
if [ -e "$1" ]
then
wc -l < $1
else
echo 0
fi
}
. $(dirname $0)/../include.rc
. $(dirname $0)/../nfs.rc
cleanup
TEST glusterd
TEST pidof glusterd
TEST $CLI volume create $V0 $H0:$B0/brick1
EXPECT 'Created' volinfo_field $V0 'Status'
TEST $CLI volume start $V0;
EXPECT 'Started' volinfo_field $V0 'Status'
# glusterfs/nfs needs some time to start up in the background
EXPECT_WITHIN 20 1 is_nfs_export_available
# before mounting the rmtab should be empty
EXPECT '0' count_lines /var/lib/glusterd/nfs/rmtab
TEST mount -t nfs -o vers=3,nolock $H0:/$V0 $N0
# the output would looks similar to:
#
# hostname-0=172.31.122.104
# mountpoint-0=/ufo
#
EXPECT '2' count_lines /var/lib/glusterd/nfs/rmtab
# duplicate mounts should not be recorded (client could have crashed)
TEST mount -t nfs -o vers=3,nolock $H0:/$V0 $N1
EXPECT '2' count_lines /var/lib/glusterd/nfs/rmtab
# removing a mount should (even if there are two) should remove the entry
TEST umount $N1
EXPECT '0' count_lines /var/lib/glusterd/nfs/rmtab
# unmounting the other mount should work flawlessly
TEST umount $N0
EXPECT '0' count_lines /var/lib/glusterd/nfs/rmtab
TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $M0
# we'll create a fake rmtab here, similar to how an other storage server would do
# using an invalid IP address to prevent (unlikely) collisions on the test-machine
cat << EOF > $M0/rmtab
hostname-0=127.0.0.256
mountpoint-0=/ufo
EOF
EXPECT '2' count_lines $M0/rmtab
# reconfigure merges the rmtab with the one on the volume
TEST gluster volume set $V0 nfs.mount-rmtab $M0/rmtab
# glusterfs/nfs needs some time to restart
EXPECT_WITHIN 20 1 is_nfs_export_available
# a new mount should be added to the rmtab, not overwrite exiting ones
TEST mount -t nfs -o vers=3,nolock $H0:/$V0 $N0
EXPECT '4' count_lines $M0/rmtab
TEST umount $N0
EXPECT '2' count_lines $M0/rmtab
# TODO: nfs/reconfigure() is never called and is therefor disabled. When the
# NFS-server supports reloading and does not get restarted anymore, we should
# add a test that includes the merging of entries in the old rmtab with the new
# rmtab.
cleanup