diff options
-rw-r--r-- | tests/bugs/bug-1116503.t | 24 | ||||
-rw-r--r-- | tests/include.rc | 16 | ||||
-rw-r--r-- | tests/nfs.rc | 9 | ||||
-rw-r--r-- | tests/volume.rc | 5 | ||||
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 2 | ||||
-rw-r--r-- | xlators/nfs/server/src/mount3udp_svc.c | 9 |
6 files changed, 62 insertions, 3 deletions
diff --git a/tests/bugs/bug-1116503.t b/tests/bugs/bug-1116503.t new file mode 100644 index 00000000000..639c75bad93 --- /dev/null +++ b/tests/bugs/bug-1116503.t @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Verify that mounting NFS over UDP (MOUNT service only) works. +# + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../nfs.rc + + +cleanup; +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 +TEST $CLI volume set $V0 nfs.mount-udp on + +TEST $CLI volume start $V0 +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; + +TEST mount -t nfs -o soft,intr,vers=3,nolock,mountproto=udp,proto=tcp $H0:/$V0 $N0; +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 + +cleanup; diff --git a/tests/include.rc b/tests/include.rc index a1713880d84..5d209d61075 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -7,10 +7,13 @@ B0=${B0:=/d/backends}; # top level of brick directories H0=${H0:=`hostname --fqdn`}; # hostname DEBUG=${DEBUG:=0} # turn on debugging? statedumpdir=`gluster --print-statedumpdir`; # Default directory for statedump -CHILD_UP_TIMEOUT=60 CLI="gluster --mode=script"; +CHILD_UP_TIMEOUT=60 +NFS_EXPORT_TIMEOUT=20 +UMOUNT_TIMEOUT=5 PROCESS_UP_TIMEOUT=20 + mkdir -p $B0; mkdir -p $M0 $M1; mkdir -p $N0 $N1; @@ -225,6 +228,17 @@ function cleanup() umount $m done + # unregister nfs and related services from portmapper/rpcbind + ## nfs + rpcinfo -d 100003 3 + ## mountd + rpcinfo -d 100005 1 + rpcinfo -d 100005 3 + ## nlockmgr + rpcinfo -d 100021 1 + rpcinfo -d 100021 4 + ## nfs_acl + rpcinfo -d 100227 3 LOOPDEVICES=`losetup -a | grep "$B0/" | awk '{print $1}' | tr -d :` for l in $LOOPDEVICES; diff --git a/tests/nfs.rc b/tests/nfs.rc index f3abee84280..e35b6852284 100644 --- a/tests/nfs.rc +++ b/tests/nfs.rc @@ -18,4 +18,11 @@ function is_nfs_export_available () echo "$exp" } - +function mount_nfs () +{ + local e=$1 + local m=$2 + local opt=$3 + if [ ! -z "$opt" ]; then opt=",$opt"; fi + mount -t nfs -o soft,intr,vers=3"$opt" $e $m +} diff --git a/tests/volume.rc b/tests/volume.rc index e3346bc8004..1c58597c661 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -253,6 +253,11 @@ function dht_get_layout { getfattr -d -e hex -n $my_xa $1 2> /dev/null | grep "$my_xa=" | cut -d= -f2 } +function force_umount { + umount -f $1 + if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi +} + function afr_get_specific_changelog_xattr () { local path=$1 diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index dd66c44af77..6c5f80db3b5 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -2640,7 +2640,7 @@ mnt3svc_init (xlator_t *nfsx) } if (nfs->mount_udp) { - pthread_create (&udp_thread, NULL, mount3udp_thread, NULL); + pthread_create (&udp_thread, NULL, mount3udp_thread, nfsx); } return &mnt3prog; err: diff --git a/xlators/nfs/server/src/mount3udp_svc.c b/xlators/nfs/server/src/mount3udp_svc.c index fb59e282c8e..70aead67edb 100644 --- a/xlators/nfs/server/src/mount3udp_svc.c +++ b/xlators/nfs/server/src/mount3udp_svc.c @@ -170,8 +170,17 @@ mountudp_program_3(struct svc_req *rqstp, register SVCXPRT *transp) void * mount3udp_thread (void *argv) { + xlator_t *nfsx = argv; register SVCXPRT *transp = NULL; + GF_ASSERT (nfsx); + + if (glusterfs_this_set(nfsx)) { + gf_log (GF_MNT, GF_LOG_ERROR, "failed to set xlator, " + "nfs.mount-udp will not work"); + return NULL; + } + transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { gf_log (GF_MNT, GF_LOG_ERROR, "svcudp_create error"); |