From 175217ea52d61b97f112c06c8b0f9361b0b0de42 Mon Sep 17 00:00:00 2001 From: Samikshan Bairagya Date: Thu, 11 May 2017 15:47:22 +0530 Subject: glusterd: Make reset-brick work correctly if brick-mux is on Reset brick currently kills of the corresponding brick process. However, with brick multiplexing enabled, stopping the brick process would render all bricks attached to it unavailable. To handle this correctly, we need to make sure that the brick process is terminated only if brick-multiplexing is disabled. Otherwise, we should send the GLUSTERD_BRICK_TERMINATE rpc to the respective brick process to detach the brick that is to be reset. > Signed-off-by: Samikshan Bairagya > Reviewed-on: https://review.gluster.org/17128 > Smoke: Gluster Build System > NetBSD-regression: NetBSD Build System > CentOS-regression: Gluster Build System > Reviewed-by: Atin Mukherjee (cherry picked from commit 74383e3ec6f8244b3de9bf14016452498c1ddcf0) Change-Id: I69002d66ffe6ec36ef48af09b66c522c6d35ac58 BUG: 1449934 Signed-off-by: Samikshan Bairagya Reviewed-on: https://review.gluster.org/17253 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Atin Mukherjee --- .../glusterd/bug-1446172-brick-mux-reset-brick.t | 79 ++++++++++++++++++++++ tests/include.rc | 7 +- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/bugs/glusterd/bug-1446172-brick-mux-reset-brick.t (limited to 'tests') diff --git a/tests/bugs/glusterd/bug-1446172-brick-mux-reset-brick.t b/tests/bugs/glusterd/bug-1446172-brick-mux-reset-brick.t new file mode 100644 index 00000000000..e6aaaa4e87c --- /dev/null +++ b/tests/bugs/glusterd/bug-1446172-brick-mux-reset-brick.t @@ -0,0 +1,79 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../traps.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +function count_up_bricks { + $CLI --xml volume status | grep '1' | wc -l +} + +function count_brick_processes { + pgrep glusterfsd | wc -l +} + +TEST glusterd + +TEST $CLI volume set all cluster.brick-multiplex on +push_trapfunc "$CLI volume set all cluster.brick-multiplex off" +push_trapfunc "cleanup" + +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume create $V1 $H0:$B0/${V1}{0,1} + +TEST $CLI volume start $V0 +TEST $CLI volume start $V1 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks +EXPECT 1 count_brick_processes + +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; +# Create files +for i in {1..5} +do + echo $i > $M0/file$i.txt +done + +TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1 start + +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 3 count_up_bricks +EXPECT 1 count_brick_processes + +# Negative case with brick killed but volume-id xattr present +TEST ! $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit + +# reset-brick commit force should work and should bring up the brick +TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit force + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks +EXPECT 1 count_brick_processes + +TEST glusterfs --volfile-id=$V1 --volfile-server=$H0 $M1; +# Create files +for i in {1..5} +do + echo $i > $M1/file$i.txt +done + +TEST $CLI volume reset-brick $V1 $H0:$B0/${V1}1 start + +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 3 count_up_bricks +EXPECT 1 count_brick_processes + +# Simulate reset disk +for i in {1..5} +do + rm -rf $B0/${V1}1/file$i.txt +done + +setfattr -x trusted.glusterfs.volume-id $B0/${V1}1 +setfattr -x trusted.gfid $B0/${V1}1 + +# Test reset-brick commit. Using CLI_IGNORE_PARTITION since normal CLI uses +# the --wignore flag that essentially makes the command act like "commit force" +TEST $CLI_IGNORE_PARTITION volume reset-brick $V1 $H0:$B0/${V1}1 $H0:$B0/${V1}1 commit + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks +EXPECT 1 count_brick_processes diff --git a/tests/include.rc b/tests/include.rc index 22265755a02..5b800b5b080 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -90,7 +90,12 @@ LOGDIR=$(gluster --print-logdir) statedumpdir=`gluster --print-statedumpdir`; # Default directory for statedump CLI="gluster --mode=script --wignore"; -CLI_NO_FORCE="gluster --mode-script"; +CLI_NO_FORCE="gluster --mode=script"; + +# CLI_IGNORE_PARTITION makes sure that the warning related to bricks being on +# root partition is ignored while running the command in a "no force" mode +CLI_IGNORE_PARTITION="gluster --mode=script --wignore-partition" + _GFS () { glusterfs "$@" local mount_ret=$? -- cgit