#!/bin/bash set -x -e # set up the additional volume if lsblk | grep ^nvme then e2fsck -f -y /dev/nvme0n1 resize2fs /dev/nvme0n1 mount /dev/nvme0n1 /mnt else e2fsck -f -y /dev/xvdf resize2fs /dev/xvdf mount /dev/xvdf /mnt fi # install packages apt-get install -y git time wget binutils make jq apt-get install -y zip unzip apt-get install -y gcc libc6-dev-i386 apt-get install -y ant python3-tempita python # cgroup set up for benchexec chmod o+wt '/sys/fs/cgroup/cpuset/' chmod o+wt '/sys/fs/cgroup/cpu,cpuacct/user.slice' chmod o+wt '/sys/fs/cgroup/memory/user.slice' chmod o+wt '/sys/fs/cgroup/freezer/' # update benchmarks cd /mnt/sv-benchmarks git pull # update benchexec cd /mnt/benchexec git pull # prepare for tool packaging cd /mnt cd cprover-sv-comp git pull mkdir -p src/cbmc src/goto-cc touch LICENSE cd .. mkdir -p run cd run wget -O cbmc.xml \ https://raw.githubusercontent.com/sosy-lab/sv-comp/master/benchmark-defs/cbmc.xml sed -i 's/witness.graphml/${logfile_path_abs}${inputfile_name}-witness.graphml/' cbmc.xml cd .. mkdir -p tmp export TMPDIR=/mnt/tmp if [ x:WITNESSCHECK: = xTrue ] then cd cpachecker git pull ant cd ../run for def in \ cpa-seq-validate-correctness-witnesses \ cpa-seq-validate-violation-witnesses \ fshell-witness2test-validate-violation-witnesses do wget -O $def.xml \ https://raw.githubusercontent.com/sosy-lab/sv-comp/master/benchmark-defs/$def.xml sed -i 's#[\./]*/results-verified/LOGDIR/\${rundefinition_name}.\${inputfile_name}.files/witness.graphml#witnesses/${rundefinition_name}.${inputfile_name}-witness.graphml#' $def.xml done ln -s ../cpachecker/scripts/cpa.sh cpa.sh ln -s ../cpachecker/config/ config cd ../fshell-w2t git pull wget https://codeload.github.com/eliben/pycparser/zip/master -O pycparser-master.zip unzip pycparser-master.zip cd ../run cp -a ../fshell-w2t/* . fi # reduce the likelihood of multiple hosts processing the # same message (in addition to SQS's message hiding) sleep $(expr $RANDOM % 30) retry=1 while true do sqs=$(aws --region :AWSREGION: sqs receive-message --queue-url :SQSURL: | \ jq -r '.Messages[0].Body,.Messages[0].ReceiptHandle') if [ -z "$sqs" ] then # no un-read messages in the input queue; let's look # at -run n_msgs=$(aws --region :AWSREGION: sqs get-queue-attributes \ --queue-url :SQSURL:-run --attribute-names ApproximateNumberOfMessages | \ jq -r '.Attributes.ApproximateNumberOfMessages') if [ $retry -eq 1 ] then retry=0 sleep 30 continue elif [ -n "$n_msgs" ] && [ "$n_msgs" = "0" ] then # shut down the infrastructure aws --region us-east-1 sns publish --topic-arn :SNSTOPIC: \ --message "Trying to delete stacks in :AWSREGION:" aws --region :AWSREGION: cloudformation delete-stack --stack-name \ perf-test-sqs-:PERFTESTID: aws --region :AWSREGION: cloudformation delete-stack --stack-name \ perf-test-exec-:PERFTESTID: halt fi # the queue is gone, or other host will be turning # off the lights halt fi retry=1 bm=$(echo $sqs | cut -f1 -d" ") cfg=$(echo $bm | cut -f1 -d"-") t=$(echo $bm | cut -f2- -d"-") msg=$(echo $sqs | cut -f2- -d" ") # mark $bm in-progress aws --region :AWSREGION: sqs send-message --queue-url :SQSURL:-run \ --message-body $bm-$(hostname) # there is no guarantee of cross-queue action ordering # sleep for a bit to reduce the likelihood of missing # in-progress messages while the input queue is empty sleep 3 # remove it from the input queue aws --region :AWSREGION: sqs delete-message \ --queue-url :SQSURL: --receipt-handle $msg cd /mnt/cprover-sv-comp rm -f src/cbmc/cbmc src/goto-cc/goto-cc aws s3 cp s3://:S3BUCKET:/:PERFTESTID:/$cfg/cbmc src/cbmc/cbmc aws s3 cp s3://:S3BUCKET:/:PERFTESTID:/$cfg/goto-cc src/goto-cc/goto-cc chmod a+x src/cbmc/cbmc src/goto-cc/goto-cc make CBMC=. cbmc.zip cd ../run rm -f cbmc cbmc-binary goto-cc unzip ../cprover-sv-comp/cbmc.zip mv cbmc cbmc-zip mv cbmc-zip/* . rmdir cbmc-zip rm ../cprover-sv-comp/cbmc.zip date echo "Task: $t" # compute the number of possible executors max_par=$(cat /proc/cpuinfo | grep ^processor | wc -l) mem=$(free -g | grep ^Mem | awk '{print $2}') if [ $cfg != "profiling" ] then mem=$(expr $mem / 15) else mem=$(expr $mem / 7) fi if [ $mem -lt $max_par ] then max_par=$mem fi if [ $cfg != "profiling" ] then ../benchexec/bin/benchexec cbmc.xml --no-container \ --task $t -T 900s -M 15GB -o logs-$t/ -N $max_par -c 1 if [ -d logs-$t/cbmc.*.logfiles ] then cd logs-$t tar czf witnesses.tar.gz cbmc.*.logfiles rm -rf cbmc.*.logfiles cd .. if [ x:WITNESSCHECK: = xTrue ] then for wc in *-witnesses.xml do wcp=$(echo $wc | sed 's/-witnesses.xml$//') mkdir witnesses tar -C witnesses --strip-components=1 -xzf logs-$t/witnesses.tar.gz ../benchexec/bin/benchexec --no-container \ $wc --task $t -T 90s -M 15GB -o $wcp-logs-$t/ -N $max_par -c 1 rm -rf witnesses done fi fi start_date="$(echo :PERFTESTID: | cut -f1-3 -d-)" start_date="$start_date $(echo :PERFTESTID: | cut -f4-6 -d- | sed 's/-/:/g')" for l in *logs-$t/*.xml.bz2 do cd $(dirname $l) bunzip2 *.xml.bz2 perl -p -i -e \ "s/^(/dev/null 2>&1 then gprof --sum ./cbmc-binary cbmc*.gmon.out.* gprof ./cbmc-binary gmon.sum > sum.profile-$t rm -f gmon.sum gprof --sum ./goto-cc goto-cc*.gmon.out.* gprof ./goto-cc gmon.sum > sum.goto-cc-profile-$t rm -f gmon.sum gmon.out rm -f cbmc*.gmon.out.* rm -f goto-cc*.gmon.out.* aws s3 cp sum.profile-$t s3://:S3BUCKET:/:PERFTESTID:/$cfg/sum.profile-$t aws s3 cp sum.goto-cc-profile-$t \ s3://:S3BUCKET:/:PERFTESTID:/$cfg/sum.goto-cc-profile-$t fi fi rm -rf logs-$t sum.profile-$t date # clear out the in-progress message while true do sqs=$(aws --region :AWSREGION: sqs receive-message --queue-url :SQSURL:-run \ --visibility-timeout 10 | jq -r '.Messages[0].Body,.Messages[0].ReceiptHandle') bm2=$(echo $sqs | cut -f1 -d" ") msg2=$(echo $sqs | cut -f2- -d" ") if [ "$bm2" = "$bm-$(hostname)" ] then aws --region :AWSREGION: sqs delete-message --queue-url :SQSURL:-run \ --receipt-handle $msg2 break fi done done