From 599a8d7f7cbdddb1d38e904a47adf1fb83782305 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Fri, 14 Mar 2014 12:22:02 -0700 Subject: [PATCH] test: Add ceph_filestore_dump.sh to test ceph_filestore_dump Signed-off-by: David Zafman --- src/test/ceph_filestore_dump.sh | 245 ++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100755 src/test/ceph_filestore_dump.sh diff --git a/src/test/ceph_filestore_dump.sh b/src/test/ceph_filestore_dump.sh new file mode 100755 index 0000000000000..338c557c2b2a5 --- /dev/null +++ b/src/test/ceph_filestore_dump.sh @@ -0,0 +1,245 @@ +#! /bin/sh + +wait_for_health() { + echo -n "Wait for health_ok..." + while( ./ceph health 2> /dev/null | grep -v HEALTH_OK > /dev/null) + do + sleep 5 + done + echo DONE +} + +REP_POOL="rep_pool" +REP_NAME="REPobject" +EC_POOL="ec_pool" +EC_NAME="ECobject" +NUM_OBJECTS=40 +ERRORS=0 +TESTDIR="/tmp/test.$$" +DATADIR="/tmp/data.$$" + +echo -n "vstarting...." +OSD=4 ./vstart.sh -l -n -d -o "mon_pg_warn_min_per_osd=1" > /dev/null 2>&1 +echo DONE + +wait_for_health + +./ceph osd pool create $REP_POOL 12 12 replicated 2> /dev/null +REPID=`./ceph osd pool stats $REP_POOL 2> /dev/null | grep ^pool | awk '{ print $4 }'` + +echo "Created replicated pool #" $REPID + +parameters="erasure-code-k=2 erasure-code-m=1" +./ceph osd crush rule create-erasure ecruleset $parameters erasure-code-ruleset-failure-domain=osd 2> /dev/null +./ceph osd pool create $EC_POOL 12 12 erasure crush_ruleset=ecruleset $parameters 2> /dev/null +ECID=`./ceph osd pool stats $EC_POOL 2> /dev/null | grep ^pool | awk '{ print $4 }'` + +echo "Created Erasure coded pool #" $ECID + +echo "Creating $NUM_OBJECTS objects in replicated pool" +mkdir -p $DATADIR +for i in `seq 1 $NUM_OBJECTS` +do + NAME="${REP_NAME}$i" + rm -f $DATADIR/$NAME + for i in `seq 1 10000` + do + echo "This is the replicated data for $NAME" >> $DATADIR/$NAME + done + ./rados -p $REP_POOL put $NAME $DATADIR/$NAME 2> /dev/null +done + +echo "Creating $NUM_OBJECTS objects in erausre coded pool" +for i in `seq 1 $NUM_OBJECTS` +do + NAME="${EC_NAME}$i" + rm -f $DATADIR/$NAME + for i in `seq 1 10000` + do + echo "This is the erasure coded data for $NAME" >> $DATADIR/$NAME + done + ./rados -p $EC_POOL put $NAME $DATADIR/$NAME 2> /dev/null +done + +./stop.sh > /dev/null 2>&1 + +ALLREPPGS=`ls -d dev/*/current/${REPID}.*_head | awk -F / '{ print $4}' | sed 's/_head//' | sort -u` +#echo ALL REP PGS: $ALLREPPGS +ALLECPGS=`ls -d dev/*/current/${ECID}.*_head | awk -F / '{ print $4}' | sed 's/_head//' | sort -u` +#echo ALL EC PGS: $ALLECPGS + +OBJREPPGS=`ls dev/*/current/${REPID}.*_head/${REP_NAME}* | awk -F / '{ print $4}' | sed 's/_head//' | sort -u` +#echo OBJECT REP PGS: $OBJREPPGS +OBJECPGS=`ls dev/*/current/${ECID}.*_head/${EC_NAME}* | awk -F / '{ print $4}' | sed 's/_head//' | sort -u` +#echo OBJECT EC PGS: $OBJECPGS + +echo Checking pg info +for pg in $ALLREPPGS $ALLECPGS +do + OSDS=`ls -d dev/*/current/${pg}_head | awk -F / '{ print $2 }'` + for osd in $OSDS + do + ./ceph_filestore_dump --filestore-path dev/$osd --journal-path dev/$osd.journal --type info --pgid $pg | grep "\"pgid\": \"$pg\"" > /dev/null + if [ "$?" != "0" ]; + then + echo "FAILURE: getting info for $pg" + ERRORS=`expr $ERRORS + 1` + fi + done +done + +echo Checking pg logs +for pg in $ALLREPPGS $ALLECPGS +do + OSDS=`ls -d dev/*/current/${pg}_head | awk -F / '{ print $2 }'` + for osd in $OSDS + do + ./ceph_filestore_dump --filestore-path dev/$osd --journal-path dev/$osd.journal --type log --pgid $pg > /tmp/tmp.$$ + if [ "$?" != "0" ]; + then + echo "FAILURE: getting log for $pg from $osd" + ERRORS=`expr $ERRORS + 1` + continue + fi + # Is this pg in the list of pgs with objects + echo -e "\n$OBJREPPGS\n$OBJECPGS" | grep "^$pg$" > /dev/null + HASOBJ=$? + # Does the log have a modify + grep modify /tmp/tmp.$$ > /dev/null + MODLOG=$? + if [ "$HASOBJ" != "$MODLOG" ]; + then + echo "FAILURE: bad log for $pg from $osd" + if [ "$HASOBJ" = "0" ]; + then + MSG="" + else + MSG="NOT" + fi + echo "Log should $MSG have a modify entry" + ERRORS=`expr $ERRORS + 1` + fi + done +done +rm /tmp/tmp.$$ + +echo Checking pg export +EXP_ERRORS=0 +mkdir $TESTDIR +for pg in $ALLREPPGS $ALLECPGS +do + OSDS=`ls -d dev/*/current/${pg}_head | awk -F / '{ print $2 }'` + for osd in $OSDS + do + mkdir -p $TESTDIR/$osd + ./ceph_filestore_dump --filestore-path dev/$osd --journal-path dev/$osd.journal --type export --pgid $pg --file $TESTDIR/$osd/$pg.export.$$ > /tmp/tmp.$$ + if [ "$?" != "0" ]; + then + echo "FAILURE: Exporting $pg on $osd" + echo "ceph_filestore_dump output:" + cat /tmp/tmp.$$ + EXP_ERRORS=`expr $EXP_ERRORS + 1` + fi + rm /tmp/tmp.$$ + done +done + +ERRORS=`expr $ERRORS + $EXP_ERRORS` + +echo Checking pg removal +RM_ERRORS=0 +for pg in $ALLREPPGS $ALLECPGS +do + OSDS=`ls -d dev/*/current/${pg}_head | awk -F / '{ print $2 }'` + for osd in $OSDS + do + ./ceph_filestore_dump --filestore-path dev/$osd --journal-path dev/$osd.journal --type remove --pgid $pg > /tmp/tmp.$$ + if [ "$?" != "0" ]; + then + echo "FAILURE: Removing $pg on $osd" + echo "ceph_filestore_dump output:" + cat /tmp/tmp.$$ + RM_ERRORS=`expr $RM_ERRORS + 1` + fi + rm /tmp/tmp.$$ + done +done + +ERRORS=`expr $ERRORS + $RM_ERRORS` + +IMP_ERRORS=0 +if [ $EXP_ERRORS = "0" -a $RM_ERRORS = "0" ]; +then + for dir in $TESTDIR/* + do + osd=`basename $dir` + for file in $dir/* + do + ./ceph_filestore_dump --filestore-path dev/$osd --journal-path dev/$osd.journal --type import --file $file > /tmp/tmp.$$ + if [ "$?" != "0" ]; + then + echo "FAILURE: Importing from $file" + echo "ceph_filestore_dump output:" + cat /tmp/tmp.$$ + IMP_ERRORS=`expr $IMP_ERRORS + 1` + fi + rm /tmp/tmp.$$ + done + done +else + echo "SKIPPING IMPORT TESTS DUE TO PREVIOUS FAILURES" +fi + +ERRORS=`expr $ERRORS + $IMP_ERRORS` +rm -rf $TESTDIR + +if [ $EXP_ERRORS = "0" -a $RM_ERRORS = "0" -a $IMP_ERRORS = "0" ]; +then + echo "Checking replicated import data" + for path in ${DATADIR}/${REP_NAME}* + do + file=`basename $path` + for obj_loc in `find dev -name "${file}_*"` + do + diff $path $obj_loc > /dev/null + if [ $? != "0" ]; + then + echo FAILURE: $file data not imported properly into $obj_loc + ERRORS=`expr $ERRORS + 1` + fi + done + done + + OSD=4 ./vstart.sh -l -d -o "mon_pg_warn_min_per_osd=1" > /dev/null 2>&1 + wait_for_health + + echo "Checking erasure coded import data" + for file in ${DATADIR}/${EC_NAME}* + do + rm -f /tmp/tmp.$$ + ./rados -p $EC_POOL get `basename $file` /tmp/tmp.$$ > /dev/null 2>&1 + diff $file /tmp/tmp.$$ > /dev/null + if [ $? != "0" ]; + then + echo FAILURE: $file data not imported properly + ERRORS=`expr $ERRORS + 1` + fi + rm -f /tmp/tmp.$$ + done + + ./stop.sh > /dev/null 2>&1 +else + echo "SKIPPING CHECKING IMPORT DATA DUE TO PREVIOUS FAILURES" +fi + +rm -rf $DATADIR + +if [ $ERRORS = "0" ]; +then + echo "TEST PASSED" + exit 0 +else + echo "TEST FAILED WITH $ERRORS ERRORS" + exit 1 +fi + -- 2.39.5