ceph/qa/workunits/mon/workloadgen.sh

173 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# vim: ts=8 sw=2 smarttab
#
# $0.sh - run mon workload generator
d() {
[[ "$VERBOSE" != "" && $VERBOSE -eq 1 ]] && echo "## DEBUG ## $*"
}
d "check for required binaries"
required_bins="ceph crushtool ceph_test_mon_workloadgen"
for b in $required_bins; do
which $b >& /dev/null
if [[ $? -ne 0 ]]; then
echo "Unable to find '$b' in PATH"
exit 1
fi
done
d "Start workunit"
crush_map_fn=test.crush.map
create_crush=0
clobber_crush=0
new_cluster=0
do_run=0
num_osds=0
# Assume the test is in PATH
bin_test=ceph_test_mon_workloadgen
num_osds=10
if [[ "$LOADGEN_NUM_OSDS" != "" ]]; then
num_osds=$LOADGEN_NUM_OSDS
fi
duration=300
[ ! -z $DURATION ] && duration=$DURATION
extra=
[ ! -z $TEST_CEPH_CONF ] && extra="$extra -c $TEST_CEPH_CONF"
d "checking osd tree"
crush_testing_root="`ceph $extra osd tree | grep 'root[ \t]\+testing'`"
d "$crush_testing_root"
if [[ "$crush_testing_root" == "" ]]; then
d "set create_crush"
create_crush=1
fi
d "generate run_id (create_crush = $create_crush)"
run_id=`uuidgen`
d "run_id = $run_id ; create_crush = $create_crush"
if [[ $create_crush -eq 1 ]]; then
tmp_crush_fn="/tmp/ceph.$run_id.crush"
ceph $extra osd getcrushmap -o $tmp_crush_fn
crushtool -d $tmp_crush_fn -o $tmp_crush_fn.plain
highest_root_id=0
root_ids_raw="`cat $tmp_crush_fn.plain | grep id`"
ifs=$IFS
IFS=$'\n'
for l in $root_ids_raw; do
root_id=`echo $l | sed 's/.*-\([[:digit:]]\+\).*/\1/'`
d "root id = $root_id ; highest = $highest_root_id"
if [[ $root_id -gt $highest_root_id ]]; then
highest_root_id=$root_id
fi
done
our_root_id=$(($highest_root_id+1))
IFS=$ifs
cat << EOF >> $tmp_crush_fn.plain
root testing {
id -$our_root_id
alg straw
hash 0 # rjenkins1
}
rule testingdata {
ruleset 0
type replicated
min_size 1
max_size 10
step take testing
step choose firstn 0 type osd
step emit
}
rule testingmetadata {
ruleset 1
type replicated
min_size 1
max_size 10
step take testing
step choose firstn 0 type osd
step emit
}
rule testingrbd {
ruleset 2
type replicated
min_size 1
max_size 10
step take testing
step choose firstn 0 type osd
step emit
}
EOF
if [[ $VERBOSE -eq 1 ]]; then
cat $tmp_crush_fn.plain
fi
crushtool -c $tmp_crush_fn.plain -o $tmp_crush_fn
if [[ $? -eq 1 ]]; then
echo "Error compiling test crush map; probably need newer crushtool"
echo "NOK"
exit 1
fi
d "created crush"
ceph $extra osd setcrushmap -i $tmp_crush_fn
fi
keyring="/tmp/ceph.$run_id.keyring"
ceph $extra auth get-or-create-key osd.admin mon 'allow rwx' osd 'allow *'
ceph $extra auth export | grep -v "export" > $keyring
osd_ids=""
for osd in `seq 1 $num_osds`; do
id=`ceph $extra osd create`
osd_ids="$osd_ids $id"
d "osd.$id"
ceph $extra osd crush set $id osd.$id 1.0 host=testhost rack=testrack root=testing
done
d "osds: $osd_ids"
stub_id_args=""
f=
l=
for i in $osd_ids; do
d "i: $i"
if [[ $stub_id_args == "" ]]; then
stub_id_args="--stub-id $i"
f=$i
fi
if [[ $l != "" ]]; then
if [[ $i -gt $(($l+1)) ]]; then
stub_id_args="$stub_id_args..$l --stub-id $i"
f=$i
fi
fi
l=$i
done
if [[ $l -gt $f ]]; then
stub_id_args="$stub_id_args..$l"
fi
args="$EXTRA_ARGS --duration $duration $stub_id_args"
d "running: $args"
$bin_test $extra --keyring $keyring $args