summaryrefslogtreecommitdiffstats
path: root/tests/basic/quota-anon-fd-nfs.t
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2014-12-24 15:13:36 +0530
committerRaghavendra G <rgowdapp@redhat.com>2014-12-27 05:52:07 -0800
commitb6ea761969f85fbb0f22810eb3a3bf1476c8792c (patch)
tree935f71888ebcd80b5ff428a02167e2aac45c5483 /tests/basic/quota-anon-fd-nfs.t
parent2947752836bd3ddbc572b59cecd24557050ec2a5 (diff)
quota: For a rename operation, do quota_check_limit only till the
common ancestor of src and dst file Example: set quota limit set to 1GB on / create a file /a1/b1/file1 of 600MB mv /a1/b1/file1 /a1/b1/file2 This rename fails as it takes delta into account which sums up to 1.2BG. Though we are not creating new file, we still get quota exceeded error. So quota enforce should happen only till b1. Similarly: mv /a/b/c/file /a/b/x/y/file quota enforce should happen only till dir 'b' Change-Id: Ia1e5363da876c3d71bd424e67a8bb28b7ac1c7c1 BUG: 1153964 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/8940 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Tested-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'tests/basic/quota-anon-fd-nfs.t')
-rwxr-xr-xtests/basic/quota-anon-fd-nfs.t84
1 files changed, 59 insertions, 25 deletions
diff --git a/tests/basic/quota-anon-fd-nfs.t b/tests/basic/quota-anon-fd-nfs.t
index 0f7a9aac52e..5841580f9a8 100755
--- a/tests/basic/quota-anon-fd-nfs.t
+++ b/tests/basic/quota-anon-fd-nfs.t
@@ -1,17 +1,11 @@
#!/bin/bash
. $(dirname $0)/../include.rc
-. $(dirname $0)/../nfs.rc
-
-function usage()
-{
- local QUOTA_PATH=$1;
- $CLI volume quota $V0 list $QUOTA_PATH | \
- grep "$QUOTA_PATH" | awk '{print $4}'
-}
+. $(dirname $0)/../fileio.rc
cleanup;
+TESTS_EXPECTED_IN_LOOP=16
TEST glusterd
TEST pidof glusterd
TEST $CLI volume info;
@@ -19,34 +13,74 @@ TEST $CLI volume info;
TEST $CLI volume create $V0 $H0:$B0/brick1;
EXPECT 'Created' volinfo_field $V0 'Status';
+
+# The test makes use of inode-lru-limit to hit a scenario, where we
+# find an inode whose ancestry is not there. Following is the
+# hypothesis (which is confirmed by seeing logs indicating that
+# codepath has been executed, but not through a good understanding of
+# NFS internals).
+
+# At the end of an fop, the reference count of an inode would be
+# zero. The inode (and its ancestry) persists in memory only
+# because of non-zero lookup count. These looked up inodes are put
+# in an lru queue of size 1 (here). So, there can be at most one
+# such inode in memory.
+
+# NFS Server makes use of anonymous fds. So, if it cannot find
+# valid fd, it does a nameless lookup. This gives us an inode
+# whose ancestry is NULL. When a write happens on this inode,
+# quota-enforcer/marker finds a NULL ancestry and asks
+# storage/posix to build it.
+
TEST $CLI volume set $V0 network.inode-lru-limit 1
+TEST $CLI volume set $V0 performance.nfs.write-behind off
TEST $CLI volume start $V0;
EXPECT 'Started' volinfo_field $V0 'Status';
-EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available
-TEST mount_nfs $H0:/$V0 $N0
+TEST $CLI volume quota $V0 enable
+TEST $CLI volume quota $V0 limit-usage / 1
+TEST $CLI volume quota $V0 soft-timeout 0
+TEST $CLI volume quota $V0 hard-timeout 0
+
+TEST mount -t nfs -o noac,soft,nolock,vers=3 $H0:/$V0 $N0
deep=/0/1/2/3/4/5/6/7/8/9
TEST mkdir -p $N0/$deep
-TEST dd if=/dev/zero of=$N0/$deep/file bs=1k count=10240
+TEST touch $N0/$deep/file1 $N0/$deep/file2 $N0/$deep/file3 $N0/$deep/file4
-TEST $CLI volume quota $V0 enable
-TEST $CLI volume quota $V0 limit-usage / 20MB
-TEST $CLI volume quota $V0 soft-timeout 0
-TEST $CLI volume quota $V0 hard-timeout 0
+TEST fd_open 3 'w' "$N0/$deep/file1"
+TEST fd_open 4 'w' "$N0/$deep/file2"
+TEST fd_open 5 'w' "$N0/$deep/file3"
+TEST fd_open 6 'w' "$N0/$deep/file4"
+
+# consume all quota
+TEST ! dd if=/dev/zero of="$N0/$deep/file" bs=1MB count=1
+
+# At the end of each fop in server, reference count of the
+# inode associated with each of the file above drops to zero and hence
+# put into lru queue. Since lru-limit is set to 1, an fop next file
+# will displace the current inode from itable. This will ensure that
+# when writes happens on same fd, fd resolution results in
+# nameless lookup from server and quota_writev encounters an fd
+# associated with an inode whose parent is not present in itable.
+
+for j in $(seq 1 2); do
+ for i in $(seq 3 6); do
+ # failing writes indicate that we are enforcing quota set on /
+ # even with anonymous fds.
+ TEST_IN_LOOP ! fd_write $i "content"
+ TEST_IN_LOOP sync
+ done
+done
-TEST dd if=/dev/zero of=$N0/$deep/newfile_1 bs=512 count=10240
-# wait for write behind to complete.
-EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "15.0MB" usage "/"
+exec 3>&-
+exec 4>&-
+exec 5>&-
+exec 6>&-
-# compile the test write program and run it
-TEST $CC $(dirname $0)/quota-anon-fd-nfs.c -o $(dirname $0)/quota-anon-fd-nfs;
-# Try to create a 100Mb file which should fail
-TEST ! $(dirname $0)/quota-anon-fd-nfs $N0/$deep/newfile_2 "104857600"
-TEST rm -f $N0/$deep/newfile_2
+$CLI volume statedump $V0 all
-## Before killing daemon to avoid deadlocks
-umount_nfs $N0
+TEST umount -l $N0
cleanup;