summaryrefslogtreecommitdiffstats
path: root/tests/bugs/bug-884597.t
blob: a0540b628a01f96c50b93a903be5acf43a38086f (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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/bin/bash
. $(dirname $0)/../include.rc
. $(dirname $0)/../dht.rc
. $(dirname $0)/../volume.rc

cleanup;
BRICK_COUNT=3
function uid_gid_compare()
{
        val=1

        if [ "$1" == "$3" ]
        then
                if [ "$2" == "$4" ]
                        then
                                val=0
                fi
        fi
        echo "$val"
}


TEST glusterd
TEST pidof glusterd

TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2
TEST $CLI volume start $V0

## Mount FUSE
TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0;

i=1
NEW_UID=36
NEW_GID=36

TEST touch $M0/$i

chown $NEW_UID:$NEW_GID $M0/$i
## rename till file gets a linkfile

has_link=0
while [ $i -lt 100 ]
do
        mv $M0/$i $M0/$(( $i+1 ))
        if [ $? -ne 0 ]
        then
                break
        fi
        let i++
        file_has_linkfile $i
        has_link=$?
        if [ $has_link -eq 2 ]
        then
                break;
        fi
done

TEST [ $has_link -eq 2 ]

get_hashed_brick $i
cached=$?

# check if uid/gid on linkfile is created with correct uid/gid
BACKEND_UID=`stat --printf=%u $B0/${V0}$cached/$i`;
BACKEND_GID=`stat --printf=%g $B0/${V0}$cached/$i`;

EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID

# remove linkfile from backend, and trigger a lookup heal. uid/gid should match
rm -rf $B0/${V0}$cached/$i

# without a unmount, we are not able to trigger a lookup based heal

EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0

## Mount FUSE
TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0;

lookup=`ls -l $M0/$i 2>/dev/null`

# check if uid/gid on linkfile is created with correct uid/gid
BACKEND_UID=`stat --printf=%u $B0/${V0}$cached/$i`;
BACKEND_GID=`stat --printf=%g $B0/${V0}$cached/$i`;

EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID
# create hardlinks. Make sure a linkfile gets created

i=1
NEW_UID=36
NEW_GID=36

TEST touch $M0/file
chown $NEW_UID:$NEW_GID $M0/file;

## ln till file gets a linkfile

has_link=0
while [ $i -lt 100 ]
do
        ln $M0/file $M0/link$i
        if [ $? -ne 0 ]
        then
                break
        fi
        file_has_linkfile link$i
        has_link=$?
        if [ $has_link -eq 2 ]
        then
                break;
        fi
        let i++
done

TEST [ $has_link -eq 2 ]

get_hashed_brick link$i
cached=$?

# check if uid/gid on linkfile is created with correct uid/gid
BACKEND_UID=`stat --printf=%u $B0/${V0}$cached/link$i`;
BACKEND_GID=`stat --printf=%g $B0/${V0}$cached/link$i`;

EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID

## UID/GID creation as different user
i=1
NEW_UID=36
NEW_GID=36

TEST touch $M0/user_file1
TEST chown $NEW_UID:$NEW_GID $M0/user_file1;

## Give permission on volume, so that different users can perform rename

TEST chmod 0777 $M0

## Add a user known as ABC and perform renames
TEST `useradd -M ABC 2>/dev/null`

TEST cd $M0
## rename as different user till file gets a linkfile

has_link=0
while [ $i -lt 100 ]
do
        su -c "mv $M0/user_file$i $M0/user_file$(( $i+1 ))" ABC
        if [ $? -ne 0 ]
        then
                break
        fi
        let i++
        file_has_linkfile user_file$i
        has_link=$?
        if [ $has_link -eq 2 ]
        then
                break;
        fi
done

TEST [ $has_link -eq 2 ]

## del user ABC
TEST userdel ABC

get_hashed_brick user_file$i
cached=$?

# check if uid/gid on linkfile is created with correct uid/gid
BACKEND_UID=`stat --printf=%u $B0/${V0}$cached/user_file$i`;
BACKEND_GID=`stat --printf=%g $B0/${V0}$cached/user_file$i`;

EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID
cleanup;