From 130190a3e1f2226883284aedbd63a9505fd0b702 Mon Sep 17 00:00:00 2001 From: vmallika Date: Wed, 7 Oct 2015 15:24:46 +0530 Subject: quota/marker: dir_count accounting is not atomic This is a backport of http://review.gluster.org/#/c/11694/ Consider below scenario: Quota enabled on pre-existing data Now quota-crawl process will start healing xattrs Now if write is performed where healing is not complete, there is a possibility that 'update txn' is started before 'create xattr txn', in this case dir count can be missed on a dir where quota size xattr is not yet created. Solution is to get size xattr and if xattr is missing, add 1 for dir_count, this requires one additional fop if done in marker during each update iteration Better solution is to us xattrop GF_XATTROP_ADD_ARRAY64_WITH_DEFAULT > Change-Id: Idc8978860a3914e70c98f96effeff52e9a24e6ba > BUG: 1243798 > Signed-off-by: vmallika > Reviewed-on: http://review.gluster.org/11694 > Tested-by: NetBSD Build System > Reviewed-by: Raghavendra G Change-Id: If553372c31093d86fabe5a2ae5044a2cff28c3dc BUG: 1270769 Signed-off-by: vmallika Reviewed-on: http://review.gluster.org/12341 Tested-by: Gluster Build System Tested-by: NetBSD Build System Reviewed-by: Raghavendra G --- tests/bugs/quota/bug-1243798.t | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/bugs/quota/bug-1243798.t (limited to 'tests') diff --git a/tests/bugs/quota/bug-1243798.t b/tests/bugs/quota/bug-1243798.t new file mode 100644 index 00000000000..dc53c6928ec --- /dev/null +++ b/tests/bugs/quota/bug-1243798.t @@ -0,0 +1,50 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../nfs.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +TEST $CLI volume create $V0 $H0:$B0/$V0 +EXPECT 'Created' volinfo_field $V0 'Status'; + +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 noac,nolock + +TEST mkdir -p $N0/dir1/dir2 +TEST touch $N0/dir1/dir2/file + +TEST $CLI volume quota $V0 enable +TEST $CLI volume quota $V0 hard-timeout 0 +TEST $CLI volume quota $V0 soft-timeout 0 +TEST $CLI volume quota $V0 limit-objects /dir1 10 + +TEST stat $N0/dir1/dir2/file + +sleep 2 + +#Remove size and contri xattr from /dir1 +#Remove contri xattr from /dir1/dir2 +setfattr -x trusted.glusterfs.quota.size $B0/$V0/dir1 +setfattr -x trusted.glusterfs.quota.00000000-0000-0000-0000-000000000001.contri $B0/$V0/dir1 +contri=$(getfattr -d -m . -e hex $B0/$V0/dir1/dir2 | grep contri | awk -F= '{print $1}') +setfattr -x $contri $B0/$V0/dir1/dir2 + +#Initiate healing by writing to a file +echo Hello > $N0/dir1/dir2/file + +EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "2" quota_object_list_field "/dir1" 5 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 +TEST $CLI volume stop $V0 +EXPECT "1" get_aux + +cleanup; -- cgit