From b9d2a383a265f1552d6bad0a22c92f4e7204dd85 Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Wed, 30 Dec 2015 15:25:30 +0530 Subject: features/bitrot: Fail node-uuid getxattr if file is marked bad If xattr is node-uuid and the inode is marked bad, fail getxattr and fgetxattr with EIO. Returning EIO would result in AFR to choose correct node-uuid coresponding to the subvolume where the good copy of the file resides. Change-Id: I45a42ca38f8322d2b10f3c4c48dc504521162b42 BUG: 1294786 Signed-off-by: Kotresh HR Reviewed-on: http://review.gluster.org/13116 Tested-by: NetBSD Build System Tested-by: Gluster Build System Reviewed-by: Venky Shankar --- tests/bitrot/bug-1294786.t | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/bitrot/bug-1294786.t (limited to 'tests/bitrot') diff --git a/tests/bitrot/bug-1294786.t b/tests/bitrot/bug-1294786.t new file mode 100644 index 00000000000..2bfae36fd86 --- /dev/null +++ b/tests/bitrot/bug-1294786.t @@ -0,0 +1,68 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../cluster.rc + +function get_bitd_count_1 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | wc -l +} + +function get_bitd_count_2 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | wc -l +} + +function get_node_uuid { + getfattr -n trusted.glusterfs.node-uuid --only-values $M0/FILE 2>/dev/null +} + +cleanup; + +TEST launch_cluster 2 + +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count; + +TEST $CLI_1 volume create $V0 replica 2 $H1:$B1 $H2:$B2 +EXPECT 'Created' volinfo_field_1 $V0 'Status'; + +TEST $CLI_1 volume start $V0 +EXPECT 'Started' volinfo_field_1 $V0 'Status'; + +uuid1=$($CLI_1 system:: uuid get | awk '{print $2}') +uuid2=$($CLI_2 system:: uuid get | awk '{print $2}') + +##Mount $V0 +TEST $GFS --volfile-id=$V0 --volfile-server=$H1 $M0 + +#Enable bitrot +TEST $CLI_1 volume bitrot $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2 + +#Create sample file +TEST `echo "1234" > $M0/FILE` + +EXPECT "$uuid1" get_node_uuid; + +#Corrupt file from back-end +TEST stat $B1/FILE +echo "Corrupted data" >> $B1/FILE +#Manually set bad-file xattr since we can't wait for an hour for scrubber. +TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B1/FILE + +TEST $CLI_1 volume stop $V0 +TEST $CLI_1 volume start $V0 +EXPECT 'Started' volinfo_field_1 $V0 'Status'; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2 +#Trigger lookup so that bitrot xlator marks file as bad in its inode context. +TEST stat $M0/FILE + +EXPECT "$uuid2" get_node_uuid; + +cleanup; -- cgit