summaryrefslogtreecommitdiffstats
path: root/tests/basic/recon.t
blob: e0fbea7491a021930f437103afbd93ee51aa551a (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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/bin/bash

# Test *very basic* NSR functionality - startup, mount, simplest possible file
# write.

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

function my_getfattr {
	getfattr --only-values -e text $* 2> /dev/null
}

function get_rep_count {
	v=$(my_getfattr -n trusted.nsr.rep-count $1)
	#echo $v > /dev/tty
	echo $v
}

function create_file {
	dd if=/dev/urandom of=$1 bs=4k count=$2 conv=sync 2> /dev/null
}

function kill_a_brick {
	for r in /var/lib/glusterd/vols/${V0}/run/*-recon.pid; do
		rpid=$(cat $r)
		echo "recon PID = $rpid" > /dev/tty
		b=$(echo $r | sed '/\(.*\):\(.*\)-recon.pid/s//\1\2.pid/')
		bpid=$(cat $b)
		echo "brick PID = $bpid" > /dev/tty
		kill -9 $bpid $rpid
		return 0
	done

	# No bricks?!?
	return 1
}

# Functions to check reconciliation for specific operation types.

function check_create_write {
	for b in $*; do
		cmp $tmpdir/create-write $b/create-write || return 1
	done
	return 0
}

function check_truncate {
	truncate --size=8192 $tmpdir/truncate
	for b in $*; do
		cmp $tmpdir/truncate $b/truncate || return 1
	done
	return 0
}

function check_hard_link {
	for b in $*; do
		inum1=$(ls -i $b/hard-link-1 | cut -d' ' -f1)
		inum2=$(ls -i $b/hard-link-2 | cut -d' ' -f1)
		[ "$inum1" = "$inum2" ] || return 1
	done
	return 0
}

function check_soft_link {
	for b in $*; do
		[ "$(readlink $b/soft-link)" = "soft-link-tgt" ] || return 1
	done
	return 0
}

function check_unlink {
	for b in $*; do
		[ ! -e $b/unlink ] || return 1
	done
	return 0
}

function check_mkdir {
	for b in $*; do
		[ -d $b/mkdir ] || return 1
	done
	return 0
}

function check_rmdir {
	for b in $*; do
		[ ! -e $b/rmdir ] || return 1
	done
}

function check_setxattr {
	for b in $*; do
		v=$(my_getfattr -n user.foo $b/setxattr)
		[ "$v" = "ash_nazg_durbatuluk" ] || return 1
	done
	return 0
}

function check_removexattr {
	for b in $*; do
		my_getfattr -n user.bar $b/removexattr 2> /dev/null
		[ $? = 0 ] && return 1
	done
	return 0
}

cleanup

TEST glusterd
TEST pidof glusterd
TEST $CLI volume info

TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}

EXPECT "$V0" volinfo_field $V0 'Volume Name'
EXPECT 'Created' volinfo_field $V0 'Status'
EXPECT '2' brick_count $V0

TEST $CLI volume set $V0 cluster.nsr on
TEST $CLI volume set $V0 cluster.nsr.recon on

# This would normally be a terrible idea, but it's handy for issuing ops that
# will have to be reconciled later.
TEST $CLI volume set $V0 cluster.nsr.quorum-percent 0

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

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

# Give the bricks a chance to connect to each other.
EXPECT_WITHIN 10 "2" get_rep_count $M0

# Create local files for comparisons etc.
tmpdir=$(mktemp -d)
trap "rm -rf $tmpdir" EXIT
TEST create_file $tmpdir/create-write 10
TEST create_file $tmpdir/truncate 10

# Prepare files and directories we'll need later.
TEST cp $tmpdir/truncate $M0/
TEST touch $M0/hard-link-1
TEST touch $M0/unlink
TEST mkdir $M0/rmdir
TEST touch $M0/setxattr
TEST touch $M0/removexattr
TEST setfattr -n user.bar -v "ash_nazg_gimbatul" $M0/removexattr

# Kill a brick and wait for a new leader to take over.
TEST kill_a_brick
sleep 10

# Test create+write
TEST cp $tmpdir/create-write $M0/
# Test truncate
TEST truncate --size=8192 $M0/truncate
# Test hard link
TEST ln $M0/hard-link-1 $M0/hard-link-2
# Test soft link
# Disabled here because it not only fails but crashes the recon daemon.
TEST ln -s soft-link-tgt $M0/soft-link
# Test unlink
TEST rm $M0/unlink
# Test mkdir
TEST mkdir $M0/mkdir
# Test rmdir
TEST rmdir $M0/rmdir
# Test setxattr
TEST setfattr -n user.foo -v "ash_nazg_durbatuluk" $M0/setxattr
# Test removexattr
TEST setfattr -x user.bar $M0/removexattr

# Restart the brick and give reconciliation a chance to run.
TEST $CLI volume start $V0 force
sleep 20

# Make sure everything is as it should be.
TEST check_create_write $B0/${V0}{1,2}
TEST check_truncate $B0/${V0}{1,2}
TEST check_hard_link $B0/${V0}{1,2}
TEST check_soft_link $B0/${V0}{1,2}
TEST check_unlink $B0/${V0}{1,2}
TEST check_mkdir $B0/${V0}{1,2}
TEST check_rmdir $B0/${V0}{1,2}
#EST check_setxattr $B0/${V0}{1,2}
#EST check_removexattr $B0/${V0}{1,2}

cleanup
#killall -9 etcd