summaryrefslogtreecommitdiffstats
path: root/tests/bugs/replicate/bug-1637249-gfid-heal.t
blob: e824f14531e8bff95400fe542fa5bfc320bef2e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/bash

. $(dirname $0)/../../include.rc
. $(dirname $0)/../../volume.rc
. $(dirname $0)/../../afr.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 entry-self-heal off
TEST $CLI volume start $V0;
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1

TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0
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 for gfid + name heal when there is no 'source' brick, i.e. parent dir
# xattrs are in split-brain or have dirty xattrs.

TEST mkdir $M0/dir_pending
TEST dd if=/dev/urandom of=$M0/dir_pending/file1 bs=1024 count=1024
TEST mkdir $M0/dir_pending/dir11
TEST mkdir $M0/dir_dirty
TEST touch $M0/dir_dirty/file2

# Set pending entry xattrs on dir_pending and remove gfid of entries under it on one brick.
TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/dir_pending
TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/dir_pending

gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file1)
gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1)
TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/file1
TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1

gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/dir11)
gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11)
TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/dir11
TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11


# Set dirty entry xattrs on dir_dirty and remove gfid of entries under it on one brick.
TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/dir_dirty
gfid_f2=$(gf_get_gfid_xattr $B0/${V0}0/dir_dirty/file2)
gfid_str_f2=$(gf_gfid_xattr_to_str $gfid_f2)
TEST setfattr -x trusted.gfid $B0/${V0}1/dir_dirty/file2
TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2

# Create a file under dir_pending directly on the backend only on 1 brick
TEST touch $B0/${V0}1/dir_pending/file3

# Create a file under dir_pending directly on the backend on all bricks
TEST touch $B0/${V0}0/dir_pending/file4
TEST touch $B0/${V0}1/dir_pending/file4

# Stop  & start the volume and mount client again.
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
TEST $CLI volume stop  $V0
TEST $CLI volume start $V0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1
TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0
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/dir_pending/file1
EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file1
TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1

TEST stat $M0/dir_pending/dir11
EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_pending/dir11
TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11


TEST stat $M0/dir_dirty/file2
EXPECT "$gfid_f2" gf_get_gfid_xattr $B0/${V0}1/dir_dirty/file2
TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2

TEST stat $M0/dir_pending/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick.
gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_pending/file3)
TEST [ ! -z "$gfid_f3" ]
EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_pending/file3

TEST stat $M0/dir_pending/file4
gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file4)
TEST [ ! -z "$gfid_f4" ]
EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file4
###############################################################################

# Test for gfid + name heal when all bricks are 'source', i.e. parent dir
# does not have any pending or dirty xattrs.

TEST mkdir $M0/dir_clean
TEST dd if=/dev/urandom of=$M0/dir_clean/file1 bs=1024 count=1024
TEST mkdir $M0/dir_clean/dir11

gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file1)
gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1)
TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/file1
TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1

gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/dir11)
gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11)
TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/dir11
TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11

# Create a file under dir_clean directly on the backend only on 1 brick
TEST touch $B0/${V0}1/dir_clean/file3

# Create a file under dir_clean directly on the backend on all bricks
TEST touch $B0/${V0}0/dir_clean/file4
TEST touch $B0/${V0}1/dir_clean/file4

# Stop  & start the volume and mount client again.
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
TEST $CLI volume stop  $V0
TEST $CLI volume start $V0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1
TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0
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/dir_clean/file1
EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file1
TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1

TEST stat $M0/dir_clean/dir11
EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_clean/dir11
TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11

TEST stat $M0/dir_clean/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick.
gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_clean/file3)
TEST [ ! -z "$gfid_f3" ]
EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_clean/file3

TEST stat $M0/dir_clean/file4
gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file4)
TEST [ ! -z "$gfid_f4" ]
EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file4
###############################################################################

cleanup;