mirror of https://github.com/ceph/ceph
311 lines
7.5 KiB
Bash
Executable File
311 lines
7.5 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
. $(dirname $0)/../ceph-helpers.sh
|
|
|
|
function list_tests()
|
|
{
|
|
echo "AVAILABLE TESTS"
|
|
for i in $TESTS; do
|
|
echo " $i"
|
|
done
|
|
}
|
|
|
|
function usage()
|
|
{
|
|
echo "usage: $0 [-h|-l|-t <testname> [-t <testname>...] [--no-sanity-check] [--no-cleanup]]"
|
|
}
|
|
|
|
function expect_false()
|
|
{
|
|
set -x
|
|
if "$@"; then return 1; else return 0; fi
|
|
}
|
|
|
|
function save_commit_position()
|
|
{
|
|
local journal=$1
|
|
|
|
rados -p rbd getomapval journal.${journal} client_ \
|
|
$TMPDIR/${journal}.client_.omap
|
|
}
|
|
|
|
function restore_commit_position()
|
|
{
|
|
local journal=$1
|
|
|
|
rados -p rbd setomapval journal.${journal} client_ \
|
|
< $TMPDIR/${journal}.client_.omap
|
|
}
|
|
|
|
test_rbd_journal()
|
|
{
|
|
local image=testrbdjournal$$
|
|
|
|
rbd create --image-feature exclusive-lock --image-feature journaling \
|
|
--size 128 ${image}
|
|
local journal=$(rbd info ${image} --format=xml 2>/dev/null |
|
|
$XMLSTARLET sel -t -v "//image/journal")
|
|
test -n "${journal}"
|
|
rbd journal info ${journal}
|
|
rbd journal info --journal ${journal}
|
|
rbd journal info --image ${image}
|
|
|
|
rbd feature disable ${image} journaling
|
|
|
|
rbd info ${image} --format=xml 2>/dev/null |
|
|
expect_false $XMLSTARLET sel -t -v "//image/journal"
|
|
expect_false rbd journal info ${journal}
|
|
expect_false rbd journal info --image ${image}
|
|
|
|
rbd feature enable ${image} journaling
|
|
|
|
local journal1=$(rbd info ${image} --format=xml 2>/dev/null |
|
|
$XMLSTARLET sel -t -v "//image/journal")
|
|
test "${journal}" = "${journal1}"
|
|
|
|
rbd journal info ${journal}
|
|
|
|
rbd journal status ${journal}
|
|
|
|
local count=10
|
|
save_commit_position ${journal}
|
|
rbd bench-write ${image} --io-size 4096 --io-threads 1 \
|
|
--io-total $((4096 * count)) --io-pattern seq
|
|
rbd journal status --image ${image} | fgrep "tid=$((count - 1))"
|
|
restore_commit_position ${journal}
|
|
rbd journal status --image ${image} | fgrep "positions=[]"
|
|
local count1=$(rbd journal inspect --verbose ${journal} |
|
|
grep -c 'event_type.*AioWrite')
|
|
test "${count}" -eq "${count1}"
|
|
|
|
rbd journal export ${journal} $TMPDIR/journal.export
|
|
local size=$(stat -c "%s" $TMPDIR/journal.export)
|
|
test "${size}" -gt 0
|
|
|
|
rbd export ${image} $TMPDIR/${image}.export
|
|
|
|
local image1=${image}1
|
|
rbd create --image-feature exclusive-lock --image-feature journaling \
|
|
--size 128 ${image1}
|
|
journal1=$(rbd info ${image1} --format=xml 2>/dev/null |
|
|
$XMLSTARLET sel -t -v "//image/journal")
|
|
|
|
save_commit_position ${journal1}
|
|
rbd journal import --dest ${image1} $TMPDIR/journal.export
|
|
rbd snap create ${image1}@test
|
|
restore_commit_position ${journal1}
|
|
# check that commit position is properly updated: the journal should contain
|
|
# 12 entries (10 AioWrite + 1 SnapCreate + 1 OpFinish) and commit
|
|
# position set to tid=11
|
|
rbd journal inspect --image ${image1} --verbose | awk '
|
|
/AioWrite/ {w++} # match: "event_type": "AioWrite",
|
|
/SnapCreate/ {s++} # match: "event_type": "SnapCreate",
|
|
/OpFinish/ {f++} # match: "event_type": "OpFinish",
|
|
/entries inspected/ {t=$1; e=$4} # match: 12 entries inspected, 0 errors
|
|
{print} # for diagnostic
|
|
END {
|
|
if (w != 10 || s != 1 || f != 1 || t != 12 || e != 0) exit(1)
|
|
}
|
|
'
|
|
|
|
rbd export ${image1}@test $TMPDIR/${image1}.export
|
|
cmp $TMPDIR/${image}.export $TMPDIR/${image1}.export
|
|
|
|
rbd journal reset ${journal}
|
|
|
|
rbd journal inspect --verbose ${journal} | expect_false grep 'event_type'
|
|
|
|
rbd snap purge ${image1}
|
|
rbd remove ${image1}
|
|
rbd remove ${image}
|
|
}
|
|
|
|
|
|
rbd_assert_eq() {
|
|
local image=$1
|
|
local cmd=$2
|
|
local param=$3
|
|
local expected_val=$4
|
|
|
|
local val=$(rbd --format xml ${cmd} --image ${image} |
|
|
$XMLSTARLET sel -t -v "${param}")
|
|
test "${val}" = "${expected_val}"
|
|
}
|
|
|
|
test_rbd_create()
|
|
{
|
|
local image=testrbdcreate$$
|
|
|
|
rbd create --image-feature exclusive-lock --image-feature journaling \
|
|
--journal-pool rbd \
|
|
--journal-object-size 20M \
|
|
--journal-splay-width 6 \
|
|
--size 256 ${image}
|
|
|
|
rbd_assert_eq ${image} 'journal info' '//journal/order' 25
|
|
rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
|
|
rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
|
|
|
|
rbd remove ${image}
|
|
}
|
|
|
|
test_rbd_copy()
|
|
{
|
|
local src=testrbdcopys$$
|
|
rbd create --size 256 ${src}
|
|
|
|
local image=testrbdcopy$$
|
|
rbd copy --image-feature exclusive-lock --image-feature journaling \
|
|
--journal-pool rbd \
|
|
--journal-object-size 20M \
|
|
--journal-splay-width 6 \
|
|
${src} ${image}
|
|
|
|
rbd remove ${src}
|
|
|
|
rbd_assert_eq ${image} 'journal info' '//journal/order' 25
|
|
rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
|
|
rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
|
|
|
|
rbd remove ${image}
|
|
}
|
|
|
|
test_rbd_clone()
|
|
{
|
|
local parent=testrbdclonep$$
|
|
rbd create --image-feature layering --size 256 ${parent}
|
|
rbd snap create ${parent}@snap
|
|
rbd snap protect ${parent}@snap
|
|
|
|
local image=testrbdclone$$
|
|
rbd clone --image-feature layering --image-feature exclusive-lock --image-feature journaling \
|
|
--journal-pool rbd \
|
|
--journal-object-size 20M \
|
|
--journal-splay-width 6 \
|
|
${parent}@snap ${image}
|
|
|
|
rbd_assert_eq ${image} 'journal info' '//journal/order' 25
|
|
rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
|
|
rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
|
|
|
|
rbd remove ${image}
|
|
rbd snap unprotect ${parent}@snap
|
|
rbd snap purge ${parent}
|
|
rbd remove ${parent}
|
|
}
|
|
|
|
test_rbd_import()
|
|
{
|
|
local src=testrbdimports$$
|
|
rbd create --size 256 ${src}
|
|
|
|
rbd export ${src} $TMPDIR/${src}.export
|
|
rbd remove ${src}
|
|
|
|
local image=testrbdimport$$
|
|
rbd import --image-feature exclusive-lock --image-feature journaling \
|
|
--journal-pool rbd \
|
|
--journal-object-size 20M \
|
|
--journal-splay-width 6 \
|
|
$TMPDIR/${src}.export ${image}
|
|
|
|
rbd_assert_eq ${image} 'journal info' '//journal/order' 25
|
|
rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
|
|
rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
|
|
|
|
rbd remove ${image}
|
|
}
|
|
|
|
test_rbd_feature()
|
|
{
|
|
local image=testrbdfeature$$
|
|
|
|
rbd create --image-feature exclusive-lock --size 256 ${image}
|
|
|
|
rbd feature enable ${image} journaling \
|
|
--journal-pool rbd \
|
|
--journal-object-size 20M \
|
|
--journal-splay-width 6
|
|
|
|
rbd_assert_eq ${image} 'journal info' '//journal/order' 25
|
|
rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
|
|
rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
|
|
|
|
rbd remove ${image}
|
|
}
|
|
|
|
TESTS+=" rbd_journal"
|
|
TESTS+=" rbd_create"
|
|
TESTS+=" rbd_copy"
|
|
TESTS+=" rbd_clone"
|
|
TESTS+=" rbd_import"
|
|
TESTS+=" rbd_feature"
|
|
|
|
#
|
|
# "main" follows
|
|
#
|
|
|
|
tests_to_run=()
|
|
|
|
sanity_check=true
|
|
cleanup=true
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
opt=$1
|
|
|
|
case "$opt" in
|
|
"-l" )
|
|
do_list=1
|
|
;;
|
|
"--no-sanity-check" )
|
|
sanity_check=false
|
|
;;
|
|
"--no-cleanup" )
|
|
cleanup=false
|
|
;;
|
|
"-t" )
|
|
shift
|
|
if [[ -z "$1" ]]; then
|
|
echo "missing argument to '-t'"
|
|
usage ;
|
|
exit 1
|
|
fi
|
|
tests_to_run+=" $1"
|
|
;;
|
|
"-h" )
|
|
usage ;
|
|
exit 0
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [[ $do_list -eq 1 ]]; then
|
|
list_tests ;
|
|
exit 0
|
|
fi
|
|
|
|
TMPDIR=/tmp/rbd_journal$$
|
|
mkdir $TMPDIR
|
|
if $cleanup; then
|
|
trap "rm -fr $TMPDIR" 0
|
|
fi
|
|
|
|
if test -z "$tests_to_run" ; then
|
|
tests_to_run="$TESTS"
|
|
fi
|
|
|
|
for i in $tests_to_run; do
|
|
if $sanity_check ; then
|
|
wait_for_clean
|
|
fi
|
|
set -x
|
|
test_${i}
|
|
set +x
|
|
done
|
|
if $sanity_check ; then
|
|
wait_for_clean
|
|
fi
|
|
|
|
echo OK
|