From fb836edec5f0bd805c302497d78fa85937d9d4dc Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Wed, 12 Sep 2018 18:19:09 +0530 Subject: tests/dht: Add tests for file create Test dht file creates Change-Id: I7aba710f4911432bd3b86834efecae8f01e4052f updates: bz#1628194 Signed-off-by: N Balachandran --- tests/basic/distribute/file-create.t | 120 +++++++++++++++++++++++++++++++++++ tests/dht.rc | 39 ++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 tests/basic/distribute/file-create.t diff --git a/tests/basic/distribute/file-create.t b/tests/basic/distribute/file-create.t new file mode 100644 index 00000000000..8360c0eb556 --- /dev/null +++ b/tests/basic/distribute/file-create.t @@ -0,0 +1,120 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../common-utils.rc +. $(dirname $0)/../../dht.rc + +# Test overview: Test file creation in various scenarios + + +# Test 1 : "dht.file.hashed-subvol." +# Get the hashed subvolume for file1 in dir1 using xattr +# Create file1 in dir1 +# Check if the file is created in the brick returned by xattr + +hashdebugxattr="dht.file.hashed-subvol." + +cleanup + +TEST glusterd +TEST pidof glusterd + +# We want fixed size bricks to test min-free-disk + +# Create 2 loop devices, one per brick. +TEST truncate -s 25M $B0/brick1 +TEST truncate -s 25M $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 set $V0 cluster.min-free-disk 40% +#TEST $CLI volume set $V0 client-log-level DEBUG + +# Mount using FUSE and create a file +TEST glusterfs -s $H0 --volfile-id $V0 $M0 + +TEST mkdir $M0/dir1 + +###################################################### +# Test 1 : Test file creation on correct hashed subvol +###################################################### + +hashed="$V0-client-0" +TEST dht_first_filename_with_hashsubvol "$hashed" $M0/dir1 "big-" +firstfile=$fn_return_val + +#Create a large file to fill up $hashed past the min-free-disk limits +TEST dd if=/dev/zero of=$M0/dir1/$firstfile bs=1M count=15 + +brickpath_0=$(cat "$M0/.meta/graphs/active/$hashed/options/remote-subvolume") +brickpath_1=$(cat "$M0/.meta/graphs/active/$V0-client-1/options/remote-subvolume") + +TEST stat "$brickpath_0/dir1/$firstfile" +EXPECT "0" is_dht_linkfile "$brickpath_0/dir1/$firstfile" + + +###################################################### +# Test 2: Create a file which hashes to the subvol which has crossed +# the min-free-disk limit. It should be created on the other subvol +###################################################### + +# DHT only checks disk usage every second. Create a new file and introduce a +# delay here to ensure DHT updates the in memory disk usage +sleep 2 +TEST dd if=/dev/zero of=$M0/dir1/file-2 bs=1024 count=1 + +# Find a file that will hash to $hash_subvol +TEST dht_first_filename_with_hashsubvol $hashed $M0/dir1 "newfile-" +newfile=$fn_return_val +echo $newfile + +# Create $newfile - it should be created on the other subvol as its hash subvol +# has crossed the min-free-disk limit +TEST dd if=/dev/zero of=$M0/dir1/$newfile bs=1024 count=20 +TEST stat "$brickpath_0/dir1/$newfile" +EXPECT "1" is_dht_linkfile "$brickpath_0/dir1/$newfile" + + +#TEST rm -rf $M0/dir1/$firstfile +#TEST rm -rf $M0/dir1/$newfile + + +###################################################### +# Test 3: Test dht_filter_loc_subvol_key +###################################################### + +TEST dht_first_filename_with_hashsubvol $V0-client-1 $M0/dir1 "filter-" +newfile=$fn_return_val +echo $newfile +TEST dd if=/dev/zero of="$M0/dir1/$newfile@$V0-dht:$hashed" bs=1024 count=20 +TEST stat $M0/dir1/$newfile +TEST stat "$brickpath_0/dir1/$newfile" +EXPECT "1" is_dht_linkfile "$brickpath_1/dir1/$newfile" + + +#force_umount $M0 +#TEST $CLI volume stop $V0 +#UMOUNT_LOOP ${B0}/${V0}{1,2} +#rm -f ${B0}/brick{1,2} + + +# Cleanup +#cleanup + diff --git a/tests/dht.rc b/tests/dht.rc index 53b00645e66..6918ebde04b 100644 --- a/tests/dht.rc +++ b/tests/dht.rc @@ -1,5 +1,6 @@ #!/bin/bash +dhthashdebugxattr="dht.file.hashed-subvol." function get_layout() { @@ -133,3 +134,41 @@ function is_dht_linkfile() echo $retval return $retval } + + +# Given an existing directory on the volume, get the hashed subvol for a file +# in that directory +# Input: filename dirpath_on_mount + +function dht_get_hash_subvol() +{ + local hashed_subvol + hashed_subvol=$(getfattr --only-values -n "$dhthashdebugxattr$1" $2 2>/dev/null) + echo $hashed_subvol +} + + +# Find the first filename that hashes to the same subvol +# as $1 +# Input: subvol_name dirpath_on_mount file_pattern + +function dht_first_filename_with_hashsubvol() +{ + local in_subvol=$1 + local in_path=$2 + local in_hash_subvol + local file_pattern=$3 + local filename + + for i in {1..50} + do + filename="$file_pattern$i" + in_hash_subvol=$(dht_get_hash_subvol "$filename" "$in_path") + # echo $in_hash_subvol + if [ "$in_subvol" == "$in_hash_subvol" ]; then + fn_return_val=$filename + return 0 + fi + done + return 1 +} -- cgit