#!/bin/bash . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc . $(dirname $0)/../../dht.rc ## TO-DO: Fix the following once the dht du refresh interval issue is fixed: ## 1. Do away with sleep(1). ## 2. Do away with creation of empty files. cleanup; QDD=$(dirname $0)/quota # compile the test write program and run it build_tester $(dirname $0)/../../basic/quota.c -o $QDD TEST glusterd; TEST pidof glusterd; # Create 2 loop devices, one per brick. TEST truncate -s 100M $B0/brick1 TEST truncate -s 100M $B0/brick2 TEST L1=`SETUP_LOOP $B0/brick1` TEST MKFS_LOOP $L1 TEST L2=`SETUP_LOOP $B0/brick2` TEST MKFS_LOOP $L2 TEST mkdir -p $B0/${V0}{1,2} TEST MOUNT_LOOP $L1 $B0/${V0}1 TEST MOUNT_LOOP $L2 $B0/${V0}2 # Create a plain distribute volume with 2 subvols. TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; TEST $CLI volume start $V0; EXPECT "Started" volinfo_field $V0 'Status'; TEST $CLI volume quota $V0 enable; TEST $CLI volume set $V0 features.quota-deem-statfs on TEST $CLI volume quota $V0 limit-usage / 150MB; TEST $CLI volume set $V0 cluster.min-free-disk 50% TEST glusterfs -s $H0 --volfile-id=$V0 $M0 # Make sure quota-deem-statfs is working as expected EXPECT "150M" echo `df -h $M0 -P | tail -1 | awk {'print $2'}` # Create a new file 'foo' under the root of the volume, which hashes to subvol-0 # of DHT, that consumes 40M TEST $QDD $M0/foo 256 160 TEST stat $B0/${V0}1/foo TEST ! stat $B0/${V0}2/foo # Create a new file 'bar' under the root of the volume, which hashes to subvol-1 # of DHT, that consumes 40M TEST $QDD $M0/bar 256 160 TEST ! stat $B0/${V0}1/bar TEST stat $B0/${V0}2/bar # Touch a zero-byte file on the root of the volume to make sure the statfs data # on DHT is refreshed sleep 1; TEST touch $M0/empty1; # At this point, the available space on each subvol {60M,60M} is greater than # their min-free-disk {50M,50M}, but if this bug still exists, then # the total available space on the volume as perceived by DHT should be less # than min-free-disk, i.e., # # consumed space returned per subvol by quota = (40M + 40M) = 80M # # Therefore, consumed space per subvol computed by DHT WITHOUT the fix would be: # (80M/150M)*100 = 53% # # Available space per subvol as perceived by DHT with the bug = 47% # which is less than min-free-disk # Now I create a file that hashes to subvol-1 (counting from 0) of DHT. # If this bug still exists,then DHT should be routing this creation to subvol-0. # If this bug is fixed, then DHT should be routing the creation to subvol-1 only # as it has more than min-free-disk space available. TEST $QDD $M0/file 1 1 sleep 1; TEST ! stat $B0/${V0}1/file TEST stat $B0/${V0}2/file # Touch another zero-byte file on the root of the volume to refresh statfs # values stored by DHT. TEST touch $M0/empty2; # Now I create a new file that hashes to subvol-0, at the end of which, there # will be less than min-free-disk space available on it. TEST $QDD $M0/fil 256 80 sleep 1; TEST stat $B0/${V0}1/fil TEST ! stat $B0/${V0}2/fil # Touch to refresh statfs info cached by DHT TEST touch $M0/empty3; # Now I create a file that hashes to subvol-0 but since it has less than # min-free-disk space available, its data will be cached on subvol-1. TEST $QDD $M0/zz 256 20 TEST stat $B0/${V0}1/zz TEST stat $B0/${V0}2/zz EXPECT "$V0-client-1" dht_get_linkto_target "$B0/${V0}1/zz" EXPECT "1" is_dht_linkfile "$B0/${V0}1/zz" force_umount $M0 TEST $CLI volume stop $V0 UMOUNT_LOOP ${B0}/${V0}{1,2} rm -f ${B0}/brick{1,2} rm -f $QDD cleanup