summaryrefslogtreecommitdiffstats
path: root/tests/bugs/distribute/bug-1099890.t
blob: 40f70d4938b03af9f6ed2fa429a8461ab81c87e7 (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
#!/bin/bash

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

## TO-DO: Fix the following once the dht du refresh interval issue is fixed:
## 1. Do away with sleep(1).
## 2. Do away with creation of empty files.

cleanup;

QDD=$(dirname $0)/quota
# compile the test write program and run it
build_tester $(dirname $0)/../../basic/quota.c -o $QDD

TEST   glusterd;
TEST   pidof glusterd;

# Create 2 loop devices, one per brick.
TEST   truncate -s 100M $B0/brick1
TEST   truncate -s 100M $B0/brick2

TEST   L1=`SETUP_LOOP $B0/brick1`
TEST   MKFS_LOOP $L1

TEST   L2=`SETUP_LOOP $B0/brick2`
TEST   MKFS_LOOP $L2

TEST   mkdir -p $B0/${V0}{1,2}

TEST   MOUNT_LOOP $L1 $B0/${V0}1
TEST   MOUNT_LOOP $L2 $B0/${V0}2

# Create a plain distribute volume with 2 subvols.
TEST   $CLI volume create $V0 $H0:$B0/${V0}{1,2};

TEST   $CLI volume start $V0;
EXPECT "Started" volinfo_field $V0 'Status';

TEST   $CLI volume quota $V0 enable;

TEST   $CLI volume set $V0 features.quota-deem-statfs on

TEST   $CLI volume quota $V0 limit-usage / 150MB;

TEST   $CLI volume set $V0 cluster.min-free-disk 50%

TEST   glusterfs -s $H0 --volfile-id=$V0 $M0

# Make sure quota-deem-statfs is working as expected
EXPECT "150M" echo `df -h $M0 -P | tail -1 | awk {'print $2'}`

# Create a new file 'foo' under the root of the volume, which hashes to subvol-0
# of DHT, that consumes 40M
TEST $QDD $M0/foo 256 160

TEST   stat $B0/${V0}1/foo
TEST ! stat $B0/${V0}2/foo

# Create a new file 'bar' under the root of the volume, which hashes to subvol-1
# of DHT, that consumes 40M
TEST $QDD $M0/bar 256 160

TEST ! stat $B0/${V0}1/bar
TEST   stat $B0/${V0}2/bar

# Touch a zero-byte file on the root of the volume to make sure the statfs data
# on DHT is refreshed
sleep 1;
TEST   touch $M0/empty1;

# At this point, the available space on each subvol {60M,60M} is greater than
# their min-free-disk {50M,50M}, but if this bug still exists, then
# the total available space on the volume as perceived by DHT should be less
# than min-free-disk, i.e.,
#
# consumed space returned per subvol by quota = (40M + 40M) = 80M
#
# Therefore, consumed space per subvol computed by DHT WITHOUT the fix would be:
# (80M/150M)*100 = 53%
#
# Available space per subvol as perceived by DHT with the bug = 47%
# which is less than min-free-disk

# Now I create a file that hashes to subvol-1 (counting from 0) of DHT.
# If this bug still exists,then DHT should be routing this creation to subvol-0.
# If this bug is fixed, then DHT should be routing the creation to subvol-1 only
# as it has more than min-free-disk space available.

TEST $QDD $M0/file 1 1
sleep 1;
TEST ! stat $B0/${V0}1/file
TEST   stat $B0/${V0}2/file

# Touch another zero-byte file on the root of the volume to refresh statfs
# values stored by DHT.

TEST touch $M0/empty2;

# Now I create a new file that hashes to subvol-0, at the end of which, there
# will be less than min-free-disk space available on it.
TEST $QDD $M0/fil 256 80
sleep 1;
TEST   stat $B0/${V0}1/fil
TEST ! stat $B0/${V0}2/fil

# Touch to refresh statfs info cached by DHT

TEST   touch $M0/empty3;

# Now I create a file that hashes to subvol-0 but since it has less than
# min-free-disk space available, its data will be cached on subvol-1.

TEST $QDD $M0/zz 256 20

TEST   stat $B0/${V0}1/zz
TEST   stat $B0/${V0}2/zz

EXPECT "$V0-client-1" dht_get_linkto_target "$B0/${V0}1/zz"

EXPECT "1" is_dht_linkfile "$B0/${V0}1/zz"

force_umount $M0
TEST $CLI volume stop $V0
EXPECT "1" get_aux
UMOUNT_LOOP ${B0}/${V0}{1,2}
rm -f ${B0}/brick{1,2}

rm -f $QDD
cleanup