forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
487 lines
10 KiB
487 lines
10 KiB
#!/bin/bash |
|
# daemon operations |
|
# SPDX-License-Identifier: GPL-2.0 |
|
|
|
check_line_first() |
|
{ |
|
local line=$1 |
|
local name=$2 |
|
local base=$3 |
|
local output=$4 |
|
local lock=$5 |
|
local up=$6 |
|
|
|
local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'` |
|
local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'` |
|
local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'` |
|
local line_lock=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'` |
|
local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'` |
|
|
|
if [ "${name}" != "${line_name}" ]; then |
|
echo "FAILED: wrong name" |
|
error=1 |
|
fi |
|
|
|
if [ "${base}" != "${line_base}" ]; then |
|
echo "FAILED: wrong base" |
|
error=1 |
|
fi |
|
|
|
if [ "${output}" != "${line_output}" ]; then |
|
echo "FAILED: wrong output" |
|
error=1 |
|
fi |
|
|
|
if [ "${lock}" != "${line_lock}" ]; then |
|
echo "FAILED: wrong lock" |
|
error=1 |
|
fi |
|
|
|
if [ "${up}" != "${line_up}" ]; then |
|
echo "FAILED: wrong up" |
|
error=1 |
|
fi |
|
} |
|
|
|
check_line_other() |
|
{ |
|
local line=$1 |
|
local name=$2 |
|
local run=$3 |
|
local base=$4 |
|
local output=$5 |
|
local control=$6 |
|
local ack=$7 |
|
local up=$8 |
|
|
|
local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'` |
|
local line_run=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'` |
|
local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'` |
|
local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'` |
|
local line_control=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'` |
|
local line_ack=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $7 }'` |
|
local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $8 }'` |
|
|
|
if [ "${name}" != "${line_name}" ]; then |
|
echo "FAILED: wrong name" |
|
error=1 |
|
fi |
|
|
|
if [ "${run}" != "${line_run}" ]; then |
|
echo "FAILED: wrong run" |
|
error=1 |
|
fi |
|
|
|
if [ "${base}" != "${line_base}" ]; then |
|
echo "FAILED: wrong base" |
|
error=1 |
|
fi |
|
|
|
if [ "${output}" != "${line_output}" ]; then |
|
echo "FAILED: wrong output" |
|
error=1 |
|
fi |
|
|
|
if [ "${control}" != "${line_control}" ]; then |
|
echo "FAILED: wrong control" |
|
error=1 |
|
fi |
|
|
|
if [ "${ack}" != "${line_ack}" ]; then |
|
echo "FAILED: wrong ack" |
|
error=1 |
|
fi |
|
|
|
if [ "${up}" != "${line_up}" ]; then |
|
echo "FAILED: wrong up" |
|
error=1 |
|
fi |
|
} |
|
|
|
daemon_exit() |
|
{ |
|
local config=$1 |
|
|
|
local line=`perf daemon --config ${config} -x: | head -1` |
|
local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` |
|
|
|
# Reset trap handler. |
|
trap - SIGINT SIGTERM |
|
|
|
# stop daemon |
|
perf daemon stop --config ${config} |
|
|
|
# ... and wait for the pid to go away |
|
tail --pid=${pid} -f /dev/null |
|
} |
|
|
|
daemon_start() |
|
{ |
|
local config=$1 |
|
local session=$2 |
|
|
|
perf daemon start --config ${config} |
|
|
|
# Clean up daemon if interrupted. |
|
trap "echo 'FAILED: Signal caught'; daemon_exit ${config}; exit 1" SIGINT SIGTERM |
|
|
|
# wait for the session to ping |
|
local state="FAIL" |
|
local retries=0 |
|
while [ "${state}" != "OK" ]; do |
|
state=`perf daemon ping --config ${config} --session ${session} | awk '{ print $1 }'` |
|
sleep 0.05 |
|
retries=$((${retries} +1)) |
|
if [ ${retries} -ge 600 ]; then |
|
echo "FAILED: Timeout waiting for daemon to ping" |
|
daemon_exit ${config} |
|
exit 1 |
|
fi |
|
done |
|
} |
|
|
|
test_list() |
|
{ |
|
echo "test daemon list" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
|
|
[session-time] |
|
run = -e task-clock -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} size |
|
|
|
# check first line |
|
# pid:daemon:base:base/output:base/lock |
|
local line=`perf daemon --config ${config} -x: | head -1` |
|
check_line_first ${line} daemon ${base} ${base}/output ${base}/lock "0" |
|
|
|
# check 1st session |
|
# pid:size:-e cpu-clock:base/size:base/size/output:base/size/control:base/size/ack:0 |
|
local line=`perf daemon --config ${config} -x: | head -2 | tail -1` |
|
check_line_other "${line}" size "-e cpu-clock -m 1 sleep 10" ${base}/session-size \ |
|
${base}/session-size/output ${base}/session-size/control \ |
|
${base}/session-size/ack "0" |
|
|
|
# check 2nd session |
|
# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 |
|
local line=`perf daemon --config ${config} -x: | head -3 | tail -1` |
|
check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \ |
|
${base}/session-time/output ${base}/session-time/control \ |
|
${base}/session-time/ack "0" |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
} |
|
|
|
test_reconfig() |
|
{ |
|
echo "test daemon reconfig" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
# prepare config |
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
|
|
[session-time] |
|
run = -e task-clock -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} size |
|
|
|
# check 2nd session |
|
# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 |
|
local line=`perf daemon --config ${config} -x: | head -3 | tail -1` |
|
check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \ |
|
${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0" |
|
local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'` |
|
|
|
# prepare new config |
|
local config_new=${config}.new |
|
cat <<EOF > ${config_new} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
|
|
[session-time] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
EOF |
|
|
|
# TEST 1 - change config |
|
|
|
sed -i -e "s|BASE|${base}|" ${config_new} |
|
cp ${config_new} ${config} |
|
|
|
# wait for old session to finish |
|
tail --pid=${pid} -f /dev/null |
|
|
|
# wait for new one to start |
|
local state="FAIL" |
|
while [ "${state}" != "OK" ]; do |
|
state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` |
|
done |
|
|
|
# check reconfigured 2nd session |
|
# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0 |
|
local line=`perf daemon --config ${config} -x: | head -3 | tail -1` |
|
check_line_other "${line}" time "-e cpu-clock -m 1 sleep 10" ${base}/session-time \ |
|
${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0" |
|
|
|
# TEST 2 - empty config |
|
|
|
local config_empty=${config}.empty |
|
cat <<EOF > ${config_empty} |
|
[daemon] |
|
base=BASE |
|
EOF |
|
|
|
# change config |
|
sed -i -e "s|BASE|${base}|" ${config_empty} |
|
cp ${config_empty} ${config} |
|
|
|
# wait for sessions to finish |
|
local state="OK" |
|
while [ "${state}" != "FAIL" ]; do |
|
state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` |
|
done |
|
|
|
local state="OK" |
|
while [ "${state}" != "FAIL" ]; do |
|
state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` |
|
done |
|
|
|
local one=`perf daemon --config ${config} -x: | wc -l` |
|
|
|
if [ ${one} -ne "1" ]; then |
|
echo "FAILED: wrong list output" |
|
error=1 |
|
fi |
|
|
|
# TEST 3 - config again |
|
|
|
cp ${config_new} ${config} |
|
|
|
# wait for size to start |
|
local state="FAIL" |
|
while [ "${state}" != "OK" ]; do |
|
state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` |
|
done |
|
|
|
# wait for time to start |
|
local state="FAIL" |
|
while [ "${state}" != "OK" ]; do |
|
state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` |
|
done |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
rm -f ${config_new} |
|
rm -f ${config_empty} |
|
} |
|
|
|
test_stop() |
|
{ |
|
echo "test daemon stop" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
# prepare config |
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
|
|
[session-time] |
|
run = -e task-clock -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} size |
|
|
|
local pid_size=`perf daemon --config ${config} -x: | head -2 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'` |
|
local pid_time=`perf daemon --config ${config} -x: | head -3 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'` |
|
|
|
# check that sessions are running |
|
if [ ! -d "/proc/${pid_size}" ]; then |
|
echo "FAILED: session size not up" |
|
fi |
|
|
|
if [ ! -d "/proc/${pid_time}" ]; then |
|
echo "FAILED: session time not up" |
|
fi |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
# check that sessions are gone |
|
if [ -d "/proc/${pid_size}" ]; then |
|
echo "FAILED: session size still up" |
|
fi |
|
|
|
if [ -d "/proc/${pid_time}" ]; then |
|
echo "FAILED: session time still up" |
|
fi |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
} |
|
|
|
test_signal() |
|
{ |
|
echo "test daemon signal" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
# prepare config |
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-test] |
|
run = -e cpu-clock --switch-output -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} test |
|
|
|
# send 2 signals |
|
perf daemon signal --config ${config} --session test |
|
perf daemon signal --config ${config} |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
# count is 2 perf.data for signals and 1 for perf record finished |
|
count=`ls ${base}/session-test/ | grep perf.data | wc -l` |
|
if [ ${count} -ne 3 ]; then |
|
error=1 |
|
echo "FAILED: perf data no generated" |
|
fi |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
} |
|
|
|
test_ping() |
|
{ |
|
echo "test daemon ping" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
# prepare config |
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
|
|
[session-time] |
|
run = -e task-clock -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} size |
|
|
|
size=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'` |
|
type=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'` |
|
|
|
if [ ${size} != "OK" -o ${type} != "OK" ]; then |
|
error=1 |
|
echo "FAILED: daemon ping failed" |
|
fi |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
} |
|
|
|
test_lock() |
|
{ |
|
echo "test daemon lock" |
|
|
|
local config=$(mktemp /tmp/perf.daemon.config.XXX) |
|
local base=$(mktemp -d /tmp/perf.daemon.base.XXX) |
|
|
|
# prepare config |
|
cat <<EOF > ${config} |
|
[daemon] |
|
base=BASE |
|
|
|
[session-size] |
|
run = -e cpu-clock -m 1 sleep 10 |
|
EOF |
|
|
|
sed -i -e "s|BASE|${base}|" ${config} |
|
|
|
# start daemon |
|
daemon_start ${config} size |
|
|
|
# start second daemon over the same config/base |
|
failed=`perf daemon start --config ${config} 2>&1 | awk '{ print $1 }'` |
|
|
|
# check that we failed properly |
|
if [ ${failed} != "failed:" ]; then |
|
error=1 |
|
echo "FAILED: daemon lock failed" |
|
fi |
|
|
|
# stop daemon |
|
daemon_exit ${config} |
|
|
|
rm -rf ${base} |
|
rm -f ${config} |
|
} |
|
|
|
error=0 |
|
|
|
test_list |
|
test_reconfig |
|
test_stop |
|
test_signal |
|
test_ping |
|
test_lock |
|
|
|
exit ${error}
|
|
|