From acd2292f085b15c2c5c28169d11f20dca90f5ec9 Mon Sep 17 00:00:00 2001 From: Jeff Darcy Date: Tue, 25 Mar 2014 23:58:50 +0000 Subject: 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 --- tests/basic/recon.t | 141 ++++++++++++++++++++++----- xlators/cluster/nsr-recon/src/recon_xlator.c | 20 ++-- 2 files changed, 129 insertions(+), 32 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 diff --git a/xlators/cluster/nsr-recon/src/recon_xlator.c b/xlators/cluster/nsr-recon/src/recon_xlator.c index ffbf74296..272c35dc2 100644 --- a/xlators/cluster/nsr-recon/src/recon_xlator.c +++ b/xlators/cluster/nsr-recon/src/recon_xlator.c @@ -391,19 +391,19 @@ gf_boolean_t nsr_recon_libchangelog_get_records(xlator_t *this, char *bp, int32_ } rec->gfid[i] = '\0'; - if (opcode == GF_FOP_SYMLINK) { - // the symlink would have been removed. Hence ignore this. - // TBD - have an uniform error policy in case of such cases. - // Right now we are handling some on the source and some on the destination. - if(get_link_using_gfid(this->private, rec->gfid, rec->link_path) == _gf_false) { - rec->type = NSR_LOG_HOLE; - goto finish; - } - } - GF_ASSERT(*start == 0); start ++; + if (opcode == GF_FOP_SYMLINK) { + i = 0; + do { + if (i >= 256) { + goto finish; + } + rec->link_path[i++] = *start; + } while (*(start++) != '\0'); + } + i = 0; // If type is fop_gfid_offset+_len, get offset if ((type == fop_gfid_offset) || (type == fop_gfid_offset_len)) { -- cgit