Newer
Older
#
# This test needs to be run on the client
#
LUSTRE=${LUSTRE:-`dirname $0`/..}
. $LUSTRE/tests/test-framework.sh
init_test_env $@
CHECK_GRANT=${CHECK_GRANT:-"yes"}
GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
# 63 min 7 min AT AT AT AT"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="1 2 3 4 6 6b 12 16 44 44b 65 66 67 68"
build_test_filter
run_test 0 "empty replay"
test_0b() {
# this test attempts to trigger a race in the precreation code,
# and must run before any other objects are created on the filesystem
createmany -o $DIR/$tfile 20 || return 1
unlinkmany $DIR/$tfile 20 || return 2
}
run_test 0b "ensure object created after recover exists. (3284)"
$CHECKSTAT -t file $DIR/$tfile || return 1
rm $DIR/$tfile
run_test 1 "simple create"
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
test_1a() {
do_facet ost1 "sysctl -w lustre.fail_loc=0"
rm -fr $DIR/$tfile
local old_last_id=`cat $LPROC/obdfilter/*/last_id`
touch -o $DIR/$tfile 1
sync
local new_last_id=`cat $LPROC/obdfilter/*/last_id`
test "$old_last_id" = "$new_last_id" || {
echo "OST object create is caused by MDS"
return 1
}
old_last_id=`cat $LPROC/obdfilter/*/last_id`
echo "data" > $DIR/$tfile
sync
new_last_id=`cat $LPROC/obdfilter/*/last_id`
test "$old_last_id" = "$new_last_id "&& {
echo "CROW does not work on write"
return 1
}
rm -fr $DIR/$tfile
#define OBD_FAIL_OST_CROW_EIO | OBD_FAIL_ONCE
do_facet ost1 "sysctl -w lustre.fail_loc=0x80000801"
rm -fr $DIR/1a1
old_last_id=`cat $LPROC/obdfilter/*/last_id`
echo "data" > $DIR/1a1
sync
new_last_id=`cat $LPROC/obdfilter/*/last_id`
test "$old_last_id" = "$new_last_id" || {
echo "CROW does work with fail_loc=0x80000801"
return 1
}
rm -fr $DIR/1a1
do_facet ost1 "sysctl -w lustre.fail_loc=0"
}
#CROW run_test 1a "CROW object create (check OST last_id)"
$CHECKSTAT -t file $DIR/$tfile || return 1
rm $DIR/$tfile
run_test 2a "touch"
$CHECKSTAT -t file $DIR/$tfile || return 1
rm $DIR/$tfile
run_test 2b "touch"
mcreate $DIR/$tfile
o_directory $DIR/$tfile
$CHECKSTAT -t file $DIR/$tfile || return 2
rm $DIR/$tfile
run_test 3a "replay failed open(O_DIRECTORY)"
test_3b() {
#define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
touch $DIR/$tfile
do_facet mds "sysctl -w lustre.fail_loc=0"
$CHECKSTAT -t file $DIR/$tfile && return 2
return 0
}
run_test 3b "replay failed open -ENOMEM"
test_3c() {
#define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
touch $DIR/$tfile
do_facet mds "sysctl -w lustre.fail_loc=0"
$CHECKSTAT -t file $DIR/$tfile && return 2
return 0
}
run_test 3c "replay failed open -ENOMEM"
for i in `seq 10`; do
echo "tag-$i" > $DIR/$tfile-$i
done
for i in `seq 10`; do
grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
done
}
run_test 4 "|x| 10 open(O_CREAT)s"
test_4b() {
rm -rf $DIR/$tfile-*
$CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
}
run_test 4b "|x| rm 10 files"
# The idea is to get past the first block of precreated files on both
# osts, and then replay.
test_5() {
for i in `seq 220`; do
echo "tag-$i" > $DIR/$tfile-$i
done
for i in `seq 220`; do
grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
done
rm -rf $DIR/$tfile-*
sleep 3
# waiting for commitment of removal
}
run_test 5 "|x| 220 open(O_CREAT)"
test_6() {
mcreate $DIR/$tdir/$tfile
$CHECKSTAT -t dir $DIR/$tdir || return 1
$CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
sleep 2
# waiting for log process thread
}
run_test 6 "mkdir + contained create"
test_6b() {
$CHECKSTAT -t dir $DIR/$tdir && return 1 || true
}
run_test 6b "|X| rmdir"
test_7() {
mcreate $DIR/$tdir/$tfile
$CHECKSTAT -t dir $DIR/$tdir || return 1
$CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
rm -fr $DIR/$tdir
}
run_test 7 "mkdir |X| contained create"
test_8() {
multiop_bg_pause $DIR/$tfile mo_c || return 4
ls $DIR/$tfile
$CHECKSTAT -t file $DIR/$tfile || return 1
kill -USR1 $MULTIPID || return 2
wait $MULTIPID || return 3
rm $DIR/$tfile
}
run_test 8 "creat open |X| close"
test_9() {
mcreate $DIR/$tfile
local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
echo " old_inum == $old_inum, new_inum == $new_inum"
if [ $old_inum -eq $new_inum ] ;
then
echo " old_inum and new_inum match"
else
echo "!!!! old_inum and new_inum NOT match"
return 1
fi
rm $DIR/$tfile
}
run_test 9 "|X| create (same inum/gen)"
test_10() {
mcreate $DIR/$tfile
mv $DIR/$tfile $DIR/$tfile-2
rm -f $DIR/$tfile
$CHECKSTAT $DIR/$tfile && return 1
rm $DIR/$tfile-2
return 0
}
run_test 10 "create |X| rename unlink"
test_11() {
mcreate $DIR/$tfile
echo "old" > $DIR/$tfile
mv $DIR/$tfile $DIR/$tfile-2
echo "new" > $DIR/$tfile
grep new $DIR/$tfile
grep old $DIR/$tfile-2
grep new $DIR/$tfile || return 1
grep old $DIR/$tfile-2 || return 2
}
run_test 11 "create open write rename |X| create-old-name read"
test_12() {
mcreate $DIR/$tfile
multiop_bg_pause $DIR/$tfile o_tSc || return 3
pid=$!
rm -f $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
[ -e $DIR/$tfile ] && return 2
return 0
}
run_test 12 "open, unlink |X| close"
# 1777 - replay open after committed chmod that would make
# a regular open a failure
test_13() {
mcreate $DIR/$tfile
multiop_bg_pause $DIR/$tfile O_wc || return 3
pid=$!
chmod 0 $DIR/$tfile
$CHECKSTAT -p 0 $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
$CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
return 0
}
run_test 13 "open chmod 0 |x| write close"
test_14() {
multiop_bg_pause $DIR/$tfile O_tSc || return 4
pid=$!
rm -f $DIR/$tfile
kill -USR1 $pid || return 1
wait $pid || return 2
[ -e $DIR/$tfile ] && return 3
return 0
}
run_test 14 "open(O_CREAT), unlink |X| close"
test_15() {
multiop_bg_pause $DIR/$tfile O_tSc || return 5
pid=$!
rm -f $DIR/$tfile
touch $DIR/g11 || return 1
kill -USR1 $pid
wait $pid || return 2
[ -e $DIR/$tfile ] && return 3
touch $DIR/h11 || return 4
return 0
}
run_test 15 "open(O_CREAT), unlink |X| touch new, close"
test_16() {
mcreate $DIR/$tfile
munlink $DIR/$tfile
mcreate $DIR/$tfile-2
[ -e $DIR/$tfile ] && return 1
[ -e $DIR/$tfile-2 ] || return 2
munlink $DIR/$tfile-2 || return 3
}
run_test 16 "|X| open(O_CREAT), unlink, touch new, unlink new"
test_17() {
multiop_bg_pause $DIR/$tfile O_c || return 4
kill -USR1 $pid || return 1
wait $pid || return 2
$CHECKSTAT -t file $DIR/$tfile || return 3
rm $DIR/$tfile
}
run_test 17 "|X| open(O_CREAT), |replay| close"
test_18() {
multiop_bg_pause $DIR/$tfile O_tSc || return 8
pid=$!
rm -f $DIR/$tfile
touch $DIR/$tfile-2 || return 1
kill -USR1 $pid
wait $pid || return 2
[ -e $DIR/$tfile ] && return 3
[ -e $DIR/$tfile-2 ] || return 4
# this touch frequently fails
touch $DIR/$tfile-3 || return 5
munlink $DIR/$tfile-2 || return 6
munlink $DIR/$tfile-3 || return 7
return 0
}
run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
# bug 1855 (a simpler form of test_11 above)
test_19() {
mcreate $DIR/$tfile
echo "old" > $DIR/$tfile
mv $DIR/$tfile $DIR/$tfile-2
grep old $DIR/$tfile-2
grep old $DIR/$tfile-2 || return 2
}
run_test 19 "|X| mcreate, open, write, rename "
test_20() {
multiop_bg_pause $DIR/$tfile O_tSc || return 3
pid=$!
rm -f $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
[ -e $DIR/$tfile ] && return 2
return 0
}
run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
test_20b() { # bug 10480
BEFOREUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
dd if=/dev/zero of=$DIR/$tfile bs=4k count=10000 &
pid=$!
while [ ! -e $DIR/$tfile ] ; do
done
lfs getstripe $DIR/$tfile || return 1
rm -f $DIR/$tfile || return 2 # make it an orphan
mds_evict_client
df -P $DIR || df -P $DIR || true # reconnect
fail mds # start orphan recovery
df -P $DIR || df -P $DIR || true # reconnect
AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
log "before $BEFOREUSED, after $AFTERUSED"
[ $AFTERUSED -gt $((BEFOREUSED + 20)) ] && \
error "after $AFTERUSED > before $BEFOREUSED" && return 5
return 0
}
run_test 20b "write, unlink, eviction, replay, (test mds_cleanup_orphans)"
test_20c() { # bug 10480
multiop $DIR/$tfile Ow_c &
pid=$!
# give multiop a chance to open
sleep 1
ls -la $DIR/$tfile
mds_evict_client
df -P $DIR || df -P $DIR || true # reconnect
test -s $DIR/$tfile || error "File was truncated"
return 0
}
run_test 20c "check that client eviction does not affect file content"
multiop_bg_pause $DIR/$tfile O_tSc || return 5
pid=$!
rm -f $DIR/$tfile
touch $DIR/g11 || return 1
kill -USR1 $pid
wait $pid || return 2
[ -e $DIR/$tfile ] && return 3
touch $DIR/h11 || return 4
return 0
}
run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
test_22() {
multiop_bg_pause $DIR/$tfile O_tSc || return 3
rm -f $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
[ -e $DIR/$tfile ] && return 2
return 0
}
run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
test_23() {
multiop_bg_pause $DIR/$tfile O_tSc || return 5
rm -f $DIR/$tfile
touch $DIR/g11 || return 1
kill -USR1 $pid
wait $pid || return 2
[ -e $DIR/$tfile ] && return 3
touch $DIR/h11 || return 4
return 0
}
run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
test_24() {
multiop_bg_pause $DIR/$tfile O_tSc || return 3
rm -f $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
[ -e $DIR/$tfile ] && return 2
return 0
}
run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
test_25() {
multiop_bg_pause $DIR/$tfile O_tSc || return 3
pid=$!
rm -f $DIR/$tfile
kill -USR1 $pid
wait $pid || return 1
[ -e $DIR/$tfile ] && return 2
return 0
}
run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
test_26() {
multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
pid2=$!
rm -f $DIR/$tfile-1
rm -f $DIR/$tfile-2
kill -USR1 $pid2
wait $pid2 || return 1
kill -USR1 $pid1
wait $pid1 || return 2
[ -e $DIR/$tfile-1 ] && return 3
[ -e $DIR/$tfile-2 ] && return 4
return 0
}
run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
test_27() {
multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
pid2=$!
rm -f $DIR/$tfile-1
rm -f $DIR/$tfile-2
kill -USR1 $pid1
wait $pid1 || return 1
kill -USR1 $pid2
wait $pid2 || return 2
[ -e $DIR/$tfile-1 ] && return 3
[ -e $DIR/$tfile-2 ] && return 4
return 0
}
run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
test_28() {
multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
rm -f $DIR/$tfile-1
rm -f $DIR/$tfile-2
kill -USR1 $pid2
wait $pid2 || return 1
kill -USR1 $pid1
wait $pid1 || return 2
[ -e $DIR/$tfile-1 ] && return 3
[ -e $DIR/$tfile-2 ] && return 4
return 0
}
run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
test_29() {
multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
Loading
Loading full blame...