#!/bin/bash

#Tests for files without gfids

. $(dirname $0)/../../include.rc
. $(dirname $0)/../../volume.rc

cleanup;

TEST glusterd
TEST pidof glusterd
TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}
TEST $CLI volume set $V0 self-heal-daemon off
TEST $CLI volume set $V0 nfs.disable on
TEST touch $B0/${V0}{0,1}/{1,2,3,4}
TEST $CLI volume start $V0

TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
#Test that readdir returns entries even when no gfids are present
EXPECT 4 echo $(ls $M0 | grep -v '^\.' | wc -l)
sleep 2;
#stat the files and check that the files have same gfids on the bricks now
TEST stat $M0/1
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/1)
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/1)
TEST "[[ ! -z $gfid_0 ]]"
EXPECT $gfid_0 echo $gfid_1

TEST stat $M0/2
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/2)
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/2)
TEST "[[ ! -z $gfid_0 ]]"
EXPECT $gfid_0 echo $gfid_1

TEST stat $M0/3
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/3)
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/3)
TEST "[[ ! -z $gfid_0 ]]"
EXPECT $gfid_0 echo $gfid_1

TEST stat $M0/4
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/4)
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/4)
TEST "[[ ! -z $gfid_0 ]]"
EXPECT $gfid_0 echo $gfid_1

#Check gfid self-heal happens from one brick to other when a file has missing
#gfid
TEST kill_brick $V0 $H0 $B0/${V0}0
TEST touch $M0/a
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/a)
TEST touch $B0/${V0}0/a
# storage/posix considers that a file without gfid changed less than a second
# before doesn't exist, so we need to wait for a second to force posix to
# consider that this is a valid file but without gfid.
sleep 1
$CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
TEST stat $M0/a
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/a)
EXPECT $gfid_1 echo $gfid_0

#Check gfid self-heal doesn't happen from one brick to other when type mismatch
#is present for a name, without any xattrs
TEST kill_brick $V0 $H0 $B0/${V0}0
TEST touch $M0/b
TEST mkdir $B0/${V0}0/b
TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1
# storage/posix considers that a file without gfid changed less than a second
# before doesn't exist, so we need to wait for a second to force posix to
# consider that this is a valid file but without gfid.
sleep 1
$CLI volume start $V0 force
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
TEST ! stat $M0/b
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/b)
TEST "[[ -z \"$gfid_0\" ]]"

#Check gfid assigning doesn't happen when there is type mismatch
TEST touch $B0/${V0}1/c
TEST mkdir $B0/${V0}0/c
# storage/posix considers that a file without gfid changed less than a second
# before doesn't exist, so we need to wait for a second to force posix to
# consider that this is a valid file but without gfid.
sleep 1
TEST ! stat $M0/c
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/c)
gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/c)
TEST "[[ -z \"$gfid_1\" ]]"
TEST "[[ -z \"$gfid_0\" ]]"

#Check gfid assigning doesn't happen only when even one brick is down to prevent
# gfid split-brain
TEST kill_brick $V0 $H0 $B0/${V0}0
TEST touch $B0/${V0}1/d
# storage/posix considers that a file without gfid changed less than a second
# before doesn't exist, so we need to wait for a second to force posix to
# consider that this is a valid file but without gfid.
sleep 1
TEST ! stat $M0/d
gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/d)
TEST "[[ -z \"$gfid_1\" ]]"
TEST $CLI volume start $V0 force;
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1

#Check gfid self-heal doesn't happen from one brick to other when type mismatch
#is present for a name without any pending xattrs
#TEST kill_brick $V0 $H0 $B0/${V0}0
#TEST touch $M0/e
#TEST $CLI volume start $V0 force;
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
#TEST kill_brick $V0 $H0 $B0/${V0}1
#TEST mkdir $M0/e
#TEST $CLI volume stop $V0 force;
#TEST setfattr -x trusted.gfid $B0/${V0}1/e
#TEST setfattr -x trusted.gfid $B0/${V0}0/e
#TEST $CLI volume set $V0 cluster.entry-self-heal off
#$CLI volume start $V0 force
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1
#TEST ! stat $M0/e
#gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/e)
#gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/e)
#TEST "[[ -z \"$gfid_1\" ]]"
#TEST "[[ -z \"$gfid_0\" ]]"

#Check if lookup fails with gfid-mismatch of a file
#is present for a name without any pending xattrs
#TEST kill_brick $V0 $H0 $B0/${V0}0
#TEST touch $M0/f
#$CLI volume start $V0 force
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
#TEST kill_brick $V0 $H0 $B0/${V0}1
#TEST touch $M0/f
#simulate no pending changelog
#$CLI volume stop $V0 force
#TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1
#TEST setfattr -x trusted.afr.$V0-client-1 $B0/${V0}0
#$CLI volume start $V0 force
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1
#TEST ! stat $M0/f

cleanup
