summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/bug-1116503.t24
-rw-r--r--tests/include.rc16
-rw-r--r--tests/nfs.rc9
-rw-r--r--tests/volume.rc5
-rw-r--r--xlators/nfs/server/src/mount3.c2
-rw-r--r--xlators/nfs/server/src/mount3udp_svc.c9
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");