]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test: Add ceph_filestore_dump.sh to test ceph_filestore_dump 1455/head 1463/head
authorDavid Zafman <david.zafman@inktank.com>
Fri, 14 Mar 2014 19:22:02 +0000 (12:22 -0700)
committerDavid Zafman <david.zafman@inktank.com>
Fri, 14 Mar 2014 22:19:45 +0000 (15:19 -0700)
Signed-off-by: David Zafman <david.zafman@inktank.com>
src/test/ceph_filestore_dump.sh [new file with mode: 0755]

diff --git a/src/test/ceph_filestore_dump.sh b/src/test/ceph_filestore_dump.sh
new file mode 100755 (executable)
index 0000000..338c557
--- /dev/null
@@ -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
+