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 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
|
#!/bin/bash
. $(dirname $0)/../include.rc
. $(dirname $0)/../volume.rc
. $(dirname $0)/../snapshot.rc
. $(dirname $0)/../fileio.rc
. $(dirname $0)/../nfs.rc
#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST
function check_readonly()
{
$@ 2>&1 | grep -q 'Read-only file system'
return $?
}
function lookup()
{
ls $1
if [ "$?" == "0" ]
then
echo "Y"
else
echo "N"
fi
}
cleanup;
TESTS_EXPECTED_IN_LOOP=10
TEST init_n_bricks 3;
TEST setup_lvm 3;
TEST glusterd;
TEST pidof glusterd;
TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;
TEST $CLI volume set $V0 nfs.disable false
TEST $CLI volume start $V0;
TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;
for i in {1..10} ; do echo "file" > $M0/file$i ; done
# Create file and hard-links
TEST touch $M0/f1
TEST mkdir $M0/dir
TEST ln $M0/f1 $M0/f2
TEST ln $M0/f1 $M0/dir/f3
TEST $CLI snapshot config activate-on-create enable
TEST $CLI volume set $V0 features.uss enable;
TEST ! $CLI snapshot create snap1 $V0 no-timestamp description "";
TEST $CLI snapshot create snap1 $V0 no-timestamp;
for i in {11..20} ; do echo "file" > $M0/file$i ; done
TEST $CLI snapshot create snap2 $V0 no-timestamp;
########### Test inode numbers ###########
s1_f1_ino=$(STAT_INO $M0/.snaps/snap1/f1)
TEST [ $s1_f1_ino != 0 ]
# Inode number of f1 should be same as f2 f3 within snapshot
EXPECT $s1_f1_ino STAT_INO $M0/.snaps/snap1/f2
EXPECT $s1_f1_ino STAT_INO $M0/.snaps/snap1/dir/f3
EXPECT $s1_f1_ino STAT_INO $M0/dir/.snaps/snap1/f3
# Inode number of f1 in snap1 should be different from f1 in snap2
tmp_ino=$(STAT_INO $M0/.snaps/snap2/f1)
TEST [ $s1_f1_ino != $tmp_ino ]
# Inode number of f1 in snap1 should be different from f1 in regular volume
tmp_ino=$(STAT_INO $M0/f1)
TEST [ $s1_f1_ino != $tmp_ino ]
# Directory inode of snap1 should be different in each sub-dir
s1_ino=$(STAT_INO $M0/.snaps/snap1)
tmp_ino=$(STAT_INO $M0/dir/.snaps/snap1)
TEST [ $s1_ino != $tmp_ino ]
##########################################
mkdir $M0/dir1;
mkdir $M0/dir2;
for i in {1..10} ; do echo "foo" > $M0/dir1/foo$i ; done
for i in {1..10} ; do echo "foo" > $M0/dir2/foo$i ; done
TEST $CLI snapshot create snap3 $V0 no-timestamp;
for i in {11..20} ; do echo "foo" > $M0/dir1/foo$i ; done
for i in {11..20} ; do echo "foo" > $M0/dir2/foo$i ; done
TEST $CLI snapshot create snap4 $V0 no-timestamp;
## Test that features.uss takes only options enable/disable and throw error for
## any other argument.
for i in {1..10}; do
RANDOM_STRING=$(uuidgen | tr -dc 'a-zA-Z' | head -c 8)
TEST_IN_LOOP ! $CLI volume set $V0 features.uss $RANDOM_STRING
done
## Test that features.snapshot-directory:
## contains only '0-9a-z-_'
# starts with dot (.)
# value cannot exceed 255 characters
## and throws error for any other argument.
TEST ! $CLI volume set $V0 features.snapshot-directory a/b
TEST ! $CLI volume set $V0 features.snapshot-directory snaps
TEST ! $CLI volume set $V0 features.snapshot-directory -a
TEST ! $CLI volume set $V0 features.snapshot-directory .
TEST ! $CLI volume set $V0 features.snapshot-directory ..
TEST ! $CLI volume set $V0 features.snapshot-directory .123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;
# test 15
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" count_snaps $M0
NUM_SNAPS=$(ls $M0/.snaps | wc -l);
TEST [ $NUM_SNAPS == 4 ]
TEST ls $M0/.snaps/snap1;
TEST ls $M0/.snaps/snap2;
TEST ls $M0/.snaps/snap3;
TEST ls $M0/.snaps/snap4;
TEST ls $M0/.snaps/snap3/dir1;
TEST ls $M0/.snaps/snap3/dir2;
TEST ls $M0/.snaps/snap4/dir1;
TEST ls $M0/.snaps/snap4/dir2;
TEST ls $M0/dir1/.snaps/
TEST ! ls $M0/dir1/.snaps/snap1;
TEST ! ls $M0/dir2/.snaps/snap2;
TEST ls $M0/dir1/.snaps/snap3;
TEST ls $M0/dir2/.snaps/snap4;
TEST fd1=`fd_available`
TEST fd_open $fd1 'r' $M0/.snaps/snap1/file1;
TEST fd_cat $fd1
# opening fd with in write mode for snapshot files should fail
TEST fd2=`fd_available`
TEST ! fd_open $fd1 'w' $M0/.snaps/snap1/file2;
# lookup on .snaps in the snapshot world should fail
TEST ! stat $M0/.snaps/snap1/.snaps
# creating new entries in snapshots should fail
TEST check_readonly mkdir $M0/.snaps/new
TEST check_readonly touch $M0/.snaps/snap2/other;
TEST fd3=`fd_available`
TEST fd_open $fd3 'r' $M0/dir1/.snaps/snap3/foo1
TEST fd_cat $fd3;
TEST fd_close $fd1;
TEST fd_close $fd2;
TEST fd_close $fd3
# similar tests on nfs mount
##Wait for connection establishment between nfs server and brick process
EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;
#test 44
TEST mount_nfs $H0:/$V0 $N0 nolock;
NUM_SNAPS=$(ls $N0/.snaps | wc -l);
TEST [ $NUM_SNAPS == 4 ];
TEST stat $N0/.snaps/snap1;
TEST stat $N0/.snaps/snap2;
TEST ls -l $N0/.snaps;
# readdir + lookup on each entry
TEST ls -l $N0/.snaps/snap1;
TEST ls -l $N0/.snaps/snap2;
# readdir + access each entry by doing stat. If snapview-server has not
# filled the fs instance and handle in the inode context of the entry as
# part of readdirp, then when stat comes (i.e fop comes directly without
# a previous lookup), snapview-server should do a lookup of the entry via
# gfapi call and fill in the fs instance + handle information in the inode
# context
TEST ls $N0/.snaps/snap3/;
TEST stat $N0/.snaps/snap3/dir1;
TEST stat $N0/.snaps/snap3/dir2;
TEST ls -l $N0/.snaps/snap3/dir1;
TEST ls -l $N0/.snaps/snap3/dir2;
TEST ls -l $N0/.snaps/snap4/dir1;
TEST ls -l $N0/.snaps/snap4/dir2;
TEST ! ls -l $N0/dir1/.snaps/snap1;
TEST ! ls -l $N0/dir2/.snaps/snap2;
TEST ls -l $N0/dir1/.snaps/snap3;
TEST ls -l $N0/dir2/.snaps/snap4;
TEST fd1=`fd_available`
TEST fd_open $fd1 'r' $N0/.snaps/snap1/file1;
TEST fd_cat $fd1
TEST fd2=`fd_available`
TEST ! fd_open $fd1 'w' $N0/.snaps/snap1/file2;
TEST ! stat $N0/.snaps/snap1/.stat
TEST check_readonly mkdir $N0/.snaps/new
TEST check_readonly touch $N0/.snaps/snap2/other;
TEST fd3=`fd_available`
TEST fd_open $fd3 'r' $N0/dir1/.snaps/snap3/foo1
TEST fd_cat $fd3;
TEST fd_close $fd1;
TEST fd_close $fd2;
TEST fd_close $fd3;
# test 73
TEST $CLI volume set $V0 "features.snapshot-directory" .history
#snapd client might take fraction of time to compare the volfile from glusterd
#hence a EXPECT_WITHIN is a better choice here
EXPECT_WITHIN 2 "Y" lookup "$M0/.history";
NUM_SNAPS=$(ls $M0/.history | wc -l);
TEST [ $NUM_SNAPS == 4 ]
TEST ls $M0/.history/snap1;
TEST ls $M0/.history/snap2;
TEST ls $M0/.history/snap3;
TEST ls $M0/.history/snap4;
TEST ls $M0/.history/snap3/dir1;
TEST ls $M0/.history/snap3/dir2;
TEST ls $M0/.history/snap4/dir1;
TEST ls $M0/.history/snap4/dir2;
TEST ls $M0/dir1/.history/
TEST ! ls $M0/dir1/.history/snap1;
TEST ! ls $M0/dir2/.history/snap2;
TEST ls $M0/dir1/.history/snap3;
TEST ls $M0/dir2/.history/snap4;
TEST fd1=`fd_available`
TEST fd_open $fd1 'r' $M0/.history/snap1/file1;
TEST fd_cat $fd1
# opening fd with in write mode for snapshot files should fail
TEST fd2=`fd_available`
TEST ! fd_open $fd1 'w' $M0/.history/snap1/file2;
# lookup on .history in the snapshot world should fail
TEST ! stat $M0/.history/snap1/.history
# creating new entries in snapshots should fail
TEST check_readonly mkdir $M0/.history/new
TEST check_readonly touch $M0/.history/snap2/other;
TEST fd3=`fd_available`
TEST fd_open $fd3 'r' $M0/dir1/.history/snap3/foo1
TEST fd_cat $fd3;
TEST fd_close $fd1;
TEST fd_close $fd2;
TEST fd_close $fd3
# similar tests on nfs mount
# test 103
TEST ls $N0/.history;
NUM_SNAPS=$(ls $N0/.history | wc -l);
TEST [ $NUM_SNAPS == 4 ];
TEST ls -l $N0/.history/snap1;
TEST ls -l $N0/.history/snap2;
TEST ls -l $N0/.history/snap3;
TEST ls -l $N0/.history/snap4;
TEST ls -l $N0/.history/snap3/dir1;
TEST ls -l $N0/.history/snap3/dir2;
TEST ls -l $N0/.history/snap4/dir1;
TEST ls -l $N0/.history/snap4/dir2;
TEST ! ls -l $N0/dir1/.history/snap1;
TEST ! ls -l $N0/dir2/.history/snap2;
TEST ls -l $N0/dir1/.history/snap3;
TEST ls -l $N0/dir2/.history/snap4;
TEST fd1=`fd_available`
TEST fd_open $fd1 'r' $N0/.history/snap1/file1;
TEST fd_cat $fd1
TEST fd2=`fd_available`
TEST ! fd_open $fd1 'w' $N0/.history/snap1/file2;
TEST ! stat $N0/.history/snap1/.stat
TEST check_readonly mkdir $N0/.history/new
TEST check_readonly touch $N0/.history/snap2/other;
TEST fd3=`fd_available`
TEST fd_open $fd3 'r' $N0/dir1/.history/snap3/foo1
TEST fd_cat $fd3;
TEST fd_close $fd1;
TEST fd_close $fd2;
TEST fd_close $fd3;
## Before killing daemon to avoid deadlocks
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0
#test 131
TEST $CLI snapshot create snap5 $V0 no-timestamp
TEST ls $M0/.history;
function count_snaps
{
local mount_point=$1;
local num_snaps;
num_snaps=$(ls $mount_point/.history | wc -l);
echo $num_snaps;
}
EXPECT_WITHIN 30 "5" count_snaps $M0;
# deletion of a snapshot and creation of a new snapshot with same name
# should not create problems. The data that was supposed to be present
# in the deleted snapshot need not be present in the new snapshot just
# because the name is same. Ex:
# 1) Create a file "aaa"
# 2) Create a snapshot snap6
# 3) stat the file "aaa" in snap6 and it should succeed
# 4) delete the file "aaa"
# 5) Delete the snapshot snap6
# 6) Create a snapshot snap6
# 7) stat the file "aaa" in snap6 and it should fail now
echo "aaa" > $M0/aaa;
TEST $CLI snapshot create snap6 $V0 no-timestamp
TEST ls $M0/.history;
EXPECT_WITHIN 30 "6" count_snaps $M0;
EXPECT_WITHIN 10 "Y" lookup $M0/.history/snap6/aaa
TEST rm -f $M0/aaa;
TEST $CLI snapshot delete snap6;
# drop the caches so that, the dentry for "snap6" is
# is forgotten from the client cache.
drop_cache $M0
EXPECT_WITHIN 30 "5" count_snaps $M0;
# This should fail, as snap6 just got deleted.
TEST ! stat $M0/.history/snap6
TEST $CLI snapshot create snap6 $V0 no-timestamp
TEST ls $M0/.history;
EXPECT_WITHIN 30 "6" count_snaps $M0;
TEST ls $M0/.history/snap6/;
TEST ! stat $M0/.history/snap6/aaa;
TEST stat $M0
# done with the tests start cleaning up of things
TEST $CLI volume set $V0 features.uss disable
TEST $CLI snapshot delete snap6;
TEST $CLI snapshot delete snap5;
TEST $CLI snapshot delete snap4;
TEST $CLI snapshot delete snap3;
TEST $CLI snapshot delete snap2;
TEST $CLI snapshot delete snap1;
# nfs client has been already unmounted at line 333
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
TEST $CLI volume stop $V0
TEST $CLI volume delete $V0
cleanup;
|