summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2014-03-25 23:58:50 +0000
committerJeff Darcy <jdarcy@redhat.com>2014-04-22 14:56:35 +0000
commitacd2292f085b15c2c5c28169d11f20dca90f5ec9 (patch)
tree35e691e0ab15a361595cbf8c53ae1d7e99830d16 /tests
parent90366df60fa3b9b2915a4a8d804c2e95ae1948e7 (diff)
nsr: expand coverage of reconciliation test
This version tests eight kinds of modifying operations instead of just two, and tests those two a bit better than before. Symlink had to be fixed because there was a mismatch between the actual changelog format and the nsr-recon parsing code. Setxattr and removexattr are still hopelessly broken, but that code needs to be replaced anyway when we start putting the xattr names into the changelog so it's not worth fixing them right now. When that's done we'll be up to ten kinds of operations, missing only rename. Change-Id: I3d805cf8fd324221be03edc3e5fc26d7656e4af9 Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'tests')
-rwxr-xr-xtests/basic/recon.t141
1 files changed, 119 insertions, 22 deletions
diff --git a/tests/basic/recon.t b/tests/basic/recon.t
index ab2241c7d..fac454530 100755
--- a/tests/basic/recon.t
+++ b/tests/basic/recon.t
@@ -6,14 +6,18 @@
. $(dirname $0)/../include.rc
. $(dirname $0)/../volume.rc
+function my_getfattr {
+ getfattr --only-values -e text $* 2> /dev/null
+}
+
function get_rep_count {
- v=$(getfattr --only-values -e text -n trusted.nsr.rep-count $1 2> /dev/null)
+ v=$(my_getfattr -n trusted.nsr.rep-count $1)
#echo $v > /dev/tty
echo $v
}
-function ping_file {
- dd if=/dev/urandom of=$1 bs=4k count=100 2> /dev/null
+function create_file {
+ dd if=/dev/urandom of=$1 bs=4k count=$2 conv=sync 2> /dev/null
}
function kill_a_brick {
@@ -31,15 +35,73 @@ function kill_a_brick {
return 1
}
-function count_matches {
- n=0
- for f in $B0/$V0[12]/$1; do
- cmp $M0/$1 $f 2> /dev/null
- if [ $? = 0 ]; then
- n=$((n+1))
- fi
+# Functions to check reconciliation for specific operation types.
+
+function check_create_write {
+ for b in $*; do
+ cmp $tmpdir/create-write $b/create-write || return 1
+ done
+ return 0
+}
+
+function check_truncate {
+ truncate --size=8192 $tmpdir/truncate
+ for b in $*; do
+ cmp $tmpdir/truncate $b/truncate || return 1
+ done
+ return 0
+}
+
+function check_hard_link {
+ for b in $*; do
+ inum1=$(ls -i $b/hard-link-1 | cut -d' ' -f1)
+ inum2=$(ls -i $b/hard-link-2 | cut -d' ' -f1)
+ [ "$inum1" = "$inum2" ] || return 1
+ done
+ return 0
+}
+
+function check_soft_link {
+ for b in $*; do
+ [ "$(readlink $b/soft-link)" = "soft-link-tgt" ] || return 1
+ done
+ return 0
+}
+
+function check_unlink {
+ for b in $*; do
+ [ ! -e $b/unlink ] || return 1
+ done
+ return 0
+}
+
+function check_mkdir {
+ for b in $*; do
+ [ -d $b/mkdir ] || return 1
+ done
+ return 0
+}
+
+function check_rmdir {
+ for b in $*; do
+ [ ! -e $b/rmdir ] || return 1
done
- echo $n
+}
+
+function check_setxattr {
+ for b in $*; do
+ v=$(my_getfattr -n user.foo $b/setxattr)
+ [ "$v" = "ash_nazg_durbatuluk" ] || return 1
+ done
+ return 0
+}
+
+function check_removexattr {
+ for b in $*; do
+ my_getfattr -n user.bar $b/removexattr 2> /dev/null
+ [ $? = 0 ] && return 1
+ done
+ return 0
}
cleanup
@@ -60,30 +122,65 @@ TEST $CLI volume set $V0 cluster.nsr.recon on
TEST $CLI volume start $V0
EXPECT 'Started' volinfo_field $V0 'Status'
-## Mount FUSE with caching disabled (read-only)
+# Mount FUSE with caching disabled
TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0
# Give the bricks a chance to connect to each other.
EXPECT_WITHIN 10 "2" get_rep_count $M0
-TEST ping_file $M0/probe
-TEST cmp ${M0}/probe ${B0}/${V0}1/probe
-TEST cmp ${M0}/probe ${B0}/${V0}2/probe
-
+# Create local files for comparisons etc.
+tmpdir=$(mktemp -d)
+trap "rm -rf $tmpdir" EXIT
+TEST create_file $tmpdir/create-write 10
+TEST create_file $tmpdir/truncate 10
+
+# Prepare files and directories we'll need later.
+TEST cp $tmpdir/truncate $M0/
+TEST touch $M0/hard-link-1
+TEST touch $M0/unlink
+TEST mkdir $M0/rmdir
+TEST touch $M0/setxattr
+TEST touch $M0/removexattr
+TEST setfattr -n user.bar -v "ash_nazg_gimbatul" $M0/removexattr
+
+# Kill a brick and wait for a new leader to take over.
TEST kill_a_brick
sleep 10
-# Make sure only one copy makes it while degraded.
-TEST ping_file $M0/probe2
-TEST [ $(count_matches probe2) = 1 ]
+# Test create+write
+TEST cp $tmpdir/create-write $M0/
+# Test truncate
+TEST truncate --size=8192 $M0/truncate
+# Test hard link
+TEST ln $M0/hard-link-1 $M0/hard-link-2
+# Test soft link
+# Disabled here because it not only fails but crashes the recon daemon.
+TEST ln -s soft-link-tgt $M0/soft-link
+# Test unlink
+TEST rm $M0/unlink
+# Test mkdir
+TEST mkdir $M0/mkdir
+# Test rmdir
+TEST rmdir $M0/rmdir
+# Test setxattr
+TEST setfattr -n user.foo -v "ash_nazg_durbatuluk" $M0/setxattr
+# Test removexattr
+TEST setfattr -x user.bar $M0/removexattr
# Restart the brick and give reconciliation a chance to run.
-# TBD: figure out why reconciliation takes so $#@! long to run
TEST $CLI volume start $V0 force
sleep 20
-# Make sure *both* copies are valid after reconciliation.
-TEST [ $(count_matches probe2) = 2 ]
+# Make sure everything is as it should be.
+TEST check_create_write $B0/${V0}{1,2}
+TEST check_truncate $B0/${V0}{1,2}
+TEST check_hard_link $B0/${V0}{1,2}
+TEST check_soft_link $B0/${V0}{1,2}
+TEST check_unlink $B0/${V0}{1,2}
+TEST check_mkdir $B0/${V0}{1,2}
+TEST check_rmdir $B0/${V0}{1,2}
+#EST check_setxattr $B0/${V0}{1,2}
+#EST check_removexattr $B0/${V0}{1,2}
cleanup
#killall -9 etcd