#!/bin/bash freezermountpoint=/cgroups CHECKPOINT=".." NS_EXEC="$CHECKPOINT/bin/ns_exec" CR="$CHECKPOINT/bin/cr" RSTR="$CHECKPOINT/bin/rstr" MKTREE="$CHECKPOINT/bin/mktree" ECHO="/bin/echo -e" TEST_CMD="./ptree2" TEST_ARGS="-n 1 -d 2" # -n: children per process, -d: depth of process tree SCRIPT_LOG="log-p2-loop" TEST_PID_FILE="pid.ptree2"; LOG_FILE="loop-ptree2.log" SNAPSHOT_DIR="snap1" TEST_DONE="test-done" CHECKPOINT_FILE="checkpoint-ptree2"; CHECKPOINT_READY="checkpoint-ready" CHECKPOINT_DONE="checkpoint-done" TEST_LOG_PREFIX="log-ptree2" TEST_LOG_SNAP="${TEST_LOG_PREFIX}.snap" freeze() { $ECHO "\t - Freezing $1" $ECHO FROZEN > ${freezermountpoint}/$1/freezer.state ret=$? if [ $ret -ne 0 ]; then $ECHO "***** FAIL: \'echo FROZEN \> $state\' returned $ret" fi } unfreeze() { $ECHO "\t - Unfreezing $1" $ECHO THAWED > ${freezermountpoint}/$1/freezer.state ret=$? if [ $ret -ne 0 ]; then $ECHO "***** FAIL: \'echo THAWED \> $state\' returned $ret" fi } cleancgroup() { $ECHO "\t - Clean cgroup of $1" rmdir ${freezermountpoint}/$1 if [ -d ${freezermountpoint}/$1 ]; then $ECHO ***** WARNING ${freezermountpoint}/$1 remains fi } checkpoint() { local pid=$1 $ECHO "Checkpoint: $CR $pid $CHECKPOINT_FILE" $CR $pid $CHECKPOINT_FILE ret=$? if [ $ret -ne 0 ]; then $ECHO "***** FAIL: Checkpoint of $pid failed" ps aux |grep $TEST_CMD >> $SCRIPT_LOG exit 1; fi } function create_container { local pid; $ECHO "\t - $NS_EXEC -cpmP $TEST_PID_FILE -- $TEST_CMD $TEST_ARGS" $NS_EXEC -cpmP $TEST_PID_FILE -- $TEST_CMD $TEST_ARGS & # Wait for test to finish setup while [ ! -f $CHECKPOINT_READY ]; do /bin/$ECHO -e "\t - Waiting for $CHECKPOINT_READY" sleep 1; done; # Find global pid of container-init pid=`cat $TEST_PID_FILE`; if [ "x$pid" == "x" ]; then $ECHO "***** FAIL: Invalid container-init pid $pid" ps -ef |grep $TEST_CMD >> $SCRIPT_LOG exit 1 fi $ECHO "Created container with pid $pid" >> $SCRIPT_LOG echo $pid } function restart_container { local ret; $ECHO "\t - Exec $NS_EXEC -cpuim -- $MKTREE --no-pids < $CHECKPOINT_FILE" sleep 1 $NS_EXEC -cpuim -- $MKTREE --no-pids < $CHECKPOINT_FILE >> $SCRIPT_LOG 2>&1 & ret=$? if [ $ret -ne 0 ]; then $ECHO "***** FAIL: Restart of $pid failed" ps aux |grep $TEST_CMD >> $SCRIPT_LOG exit 1; fi } # Check freezer mount point line=`grep freezer /proc/mounts` $ECHO $line | grep "\" if [ $? -ne 0 ]; then $ECHO "please mount freezer and ns cgroups" $ECHO " mkdir /cgroups" $ECHO " mount -t cgroup -o freezer,ns cgroup /cgroups" exit 1 fi #freezermountpoint=`$ECHO $line | awk '{ print $2 '}` # Make sure no stray e2 from another run is still going killall $TEST_CMD > $SCRIPT_LOG 2>&1 cnt=1 while [ 1 ]; do > $SCRIPT_LOG; dmesg -c > /dev/null $ECHO "===== Iteration $cnt" # Remove any 'state' files, start the app and let it tell us # when it is ready rm -f $CHECKPOINT_READY $TEST_DONE $TEST_PID_FILE $NS_EXEC -cpumP $TEST_PID_FILE -- $TEST_CMD $TEST_ARGS& $ECHO "\t - $NS_EXEC -cpumP $TEST_PID_FILE -- $TEST_CMD $TEST_ARGS" # Wait for test to finish setup while [ ! -f $CHECKPOINT_READY ]; do $ECHO "\t - Waiting for $CHECKPOINT_READY" sleep 1; done; ps -ef |grep ptree2 >> $SCRIPT_LOG # Find global pid of container-init pid=`cat $TEST_PID_FILE`; if [ "x$pid" == "x" ]; then $ECHO "***** FAIL: Invalid container-init pid $pid" ps -ef |grep $TEST_CMD exit 1 fi $ECHO $pid #pid=`create_container` $ECHO "\t - Done creating container" # Prepare for snapshot if [ -d $SNAPSHOT_DIR ]; then rm -rf ${SNAPSHOT_DIR}.prev mv $SNAPSHOT_DIR ${SNAPSHOT_DIR}.prev mkdir $SNAPSHOT_DIR fi freeze $pid num_pids1=`ps -ef |grep $TEST_CMD | wc -l` checkpoint $pid #$ECHO t > /proc/sysrq-trigger #dmesg > dmesg-1.out # Snapshot the log files cp ${TEST_LOG_PREFIX}* $SNAPSHOT_DIR touch $CHECKPOINT_DONE killall -9 `basename $TEST_CMD` unfreeze $pid sleep 3 cleancgroup $pid # Restore the snapshot after the main process has been killed /bin/cp ${SNAPSHOT_DIR}/* . # Restart. restart_container sleep 3; num_pids2=`ps -ef |grep $TEST_CMD | wc -l` ps -ef |grep ptree2 >> $SCRIPT_LOG $ECHO "\t - num_pids1 $num_pids1, num_pids2 $num_pids2"; # Find global-pid of container-init nspid=`pidof $NS_EXEC` if [ "x$nspid" == "x" ]; then $ECHO "***** FAIL: Can't find pid of $NS_EXEC" exit 1; fi # End test gracefully touch $TEST_DONE $ECHO "\t - Restart: Waiting for container-init (gloabl-pid $nspid) to exit" wait $nspid; ret=$? $ECHO "Container-init (global-pid $nspid) exited, status $ret" if [ -d /cgroups/$pid ]; then cleancgroup $pid fi cnt=$((cnt+1)) done