#!/bin/bash
. $(dirname $0)/../../include.rc
. $(dirname $0)/../../volume.rc
cleanup;

TEST glusterd
TEST pidof glusterd
TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}
TEST $CLI volume set $V0 self-heal-daemon off
TEST $CLI volume set $V0 data-self-heal off
TEST $CLI volume set $V0 entry-self-heal off
TEST $CLI volume set $V0 metadata-self-heal off
TEST $CLI volume start $V0

TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;
TEST touch $M0/file

TEST kill_brick $V0 $H0 $B0/${V0}1
TEST dd if=/dev/urandom of=$M0/file bs=1024 count=10
TEST $CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1
TEST kill_brick $V0 $H0 $B0/${V0}2
TEST dd if=/dev/urandom of=$M0/file bs=1024 count=20
TEST $CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2
TEST kill_brick $V0 $H0 $B0/${V0}0
TEST ! dd if=$M0/file of=/dev/null
SOURCE_BRICK_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)

# Various fav-child policies must not heal the file when some bricks are down.
TEST $CLI volume set $V0 favorite-child-policy size
TEST ! dd if=$M0/file of=/dev/null
TEST $CLI volume set $V0 favorite-child-policy ctime
TEST ! dd if=$M0/file of=/dev/null
TEST $CLI volume set $V0 favorite-child-policy mtime
TEST ! dd if=$M0/file of=/dev/null
TEST $CLI volume set $V0 favorite-child-policy majority
TEST ! dd if=$M0/file of=/dev/null

# CLI/mount based split-brain resolution must also not work.
TEST ! $CLI volume heal $V0 split-brain bigger-file /file
TEST ! $CLI volume heal $V0 split-brain mtime /file
TEST ! $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 /file1

TEST ! getfattr -n replica.split-brain-status $M0/file
TEST ! setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/file

# Bring all bricks back up and launch heal.
TEST $CLI volume set $V0 self-heal-daemon on
TEST $CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status
EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0
EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1
EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2
TEST $CLI volume heal $V0
EXPECT 0 get_pending_heal_count $V0
B1_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)
B2_MD5=$(md5sum $B0/${V0}2/file | cut -d\  -f1)
TEST [ "$SOURCE_BRICK_MD5" == "$B1_MD5" ]
TEST [ "$SOURCE_BRICK_MD5" == "$B2_MD5" ]

EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
cleanup;

#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000
#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000
