mirror of https://github.com/ceph/ceph
104 lines
3.0 KiB
Bash
Executable File
104 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -ex
|
|
|
|
REP_POOL=
|
|
EC_POOL=
|
|
TEMPDIR=
|
|
|
|
OSD_NUM=$(ceph osd ls | wc -l)
|
|
test ${OSD_NUM} -gt 0
|
|
|
|
setup() {
|
|
local pool
|
|
|
|
TEMPDIR=`mktemp -d`
|
|
|
|
pool=test-crushdiff-rep-$$
|
|
ceph osd pool create ${pool} 32
|
|
REP_POOL=${pool}
|
|
rados -p ${REP_POOL} bench 5 write --no-cleanup
|
|
|
|
if [ ${OSD_NUM} -gt 3 ]; then
|
|
pool=test-crushdiff-ec-$$
|
|
ceph osd pool create ${pool} 32 32 erasure
|
|
EC_POOL=${pool}
|
|
rados -p ${EC_POOL} bench 5 write --no-cleanup
|
|
fi
|
|
}
|
|
|
|
cleanup() {
|
|
set +e
|
|
|
|
test -n "${EC_POOL}" &&
|
|
ceph osd pool delete "${EC_POOL}" "${EC_POOL}" \
|
|
--yes-i-really-really-mean-it
|
|
EC_POOL=
|
|
|
|
test -n "${REP_POOL}" &&
|
|
ceph osd pool delete "${REP_POOL}" "${REP_POOL}" \
|
|
--yes-i-really-really-mean-it
|
|
REP_POOL=
|
|
|
|
test -n "${TEMPDIR}" && rm -Rf ${TEMPDIR}
|
|
TEMPDIR=
|
|
}
|
|
|
|
trap "cleanup" INT TERM EXIT
|
|
|
|
setup
|
|
|
|
# test without crushmap modification
|
|
|
|
crushdiff export ${TEMPDIR}/cm.txt --verbose
|
|
crushdiff compare ${TEMPDIR}/cm.txt --verbose
|
|
crushdiff import ${TEMPDIR}/cm.txt --verbose
|
|
|
|
# test using a compiled crushmap
|
|
|
|
crushdiff export ${TEMPDIR}/cm --compiled --verbose
|
|
crushdiff compare ${TEMPDIR}/cm --compiled --verbose
|
|
crushdiff import ${TEMPDIR}/cm --compiled --verbose
|
|
|
|
# test using "offline" osdmap and pg-dump
|
|
|
|
ceph osd getmap -o ${TEMPDIR}/osdmap
|
|
ceph pg dump --format json > ${TEMPDIR}/pg-dump
|
|
|
|
crushdiff export ${TEMPDIR}/cm.txt --osdmap ${TEMPDIR}/osdmap --verbose
|
|
crushdiff compare ${TEMPDIR}/cm.txt --osdmap ${TEMPDIR}/osdmap \
|
|
--pg-dump ${TEMPDIR}/pg-dump --verbose | tee ${TEMPDIR}/compare.txt
|
|
|
|
# test the diff is zero when the crushmap is not modified
|
|
|
|
grep '^0/[0-9]* (0\.00%) pgs affected' ${TEMPDIR}/compare.txt
|
|
grep '^0/[0-9]* (0\.00%) objects affected' ${TEMPDIR}/compare.txt
|
|
grep '^0/[0-9]* (0\.00%) pg shards to move' ${TEMPDIR}/compare.txt
|
|
grep '^0/[0-9]* (0\.00%) pg object shards to move' ${TEMPDIR}/compare.txt
|
|
grep '^0\.00/.* (0\.00%) bytes to move' ${TEMPDIR}/compare.txt
|
|
crushdiff import ${TEMPDIR}/cm.txt --osdmap ${TEMPDIR}/osdmap --verbose
|
|
|
|
if [ ${OSD_NUM} -gt 3 ]; then
|
|
|
|
# test the diff is non-zero when the crushmap is modified
|
|
|
|
cat ${TEMPDIR}/cm.txt >&2
|
|
|
|
weight=$(awk '/item osd\.0 weight ([0-9.]+)/ {print $4 * 3}' \
|
|
${TEMPDIR}/cm.txt)
|
|
test -n "${weight}"
|
|
sed -i -Ee 's/^(.*item osd\.0 weight )[0-9.]+/\1'${weight}'/' \
|
|
${TEMPDIR}/cm.txt
|
|
crushdiff compare ${TEMPDIR}/cm.txt --osdmap ${TEMPDIR}/osdmap \
|
|
--pg-dump ${TEMPDIR}/pg-dump --verbose | tee ${TEMPDIR}/compare.txt
|
|
grep '^[1-9][0-9]*/[0-9]* (.*%) pgs affected' ${TEMPDIR}/compare.txt
|
|
grep '^[1-9][0-9]*/[0-9]* (.*%) objects affected' ${TEMPDIR}/compare.txt
|
|
grep '^[1-9][0-9]*/[0-9]* (.*%) pg shards to move' ${TEMPDIR}/compare.txt
|
|
grep '^[1-9][0-9]*/[0-9]* (.*%) pg object shards to move' \
|
|
${TEMPDIR}/compare.txt
|
|
grep '^.*/.* (.*%) bytes to move' ${TEMPDIR}/compare.txt
|
|
crushdiff import ${TEMPDIR}/cm.txt --osdmap ${TEMPDIR}/osdmap --verbose
|
|
fi
|
|
|
|
echo OK
|