summaryrefslogtreecommitdiffstats
path: root/src/script/run-cbt.sh
blob: ad7e0ce2e6f76143f77f4a56847f6e28a2f62228 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh

usage() {
    prog_name=$1
    shift
    cat <<EOF
usage:
  $prog_name [options] <config-file>...

options:
  -a,--archive-dir    directory in which the test result is stored, default to $PWD/cbt-archive
  --build-dir         directory where CMakeCache.txt is located, default to $PWD
  --cbt               directory of cbt if you have already a copy of it. ceph/cbt:master will be cloned from github if not specified
  -h,--help           print this help message
  --source-dir        the path to the top level of Ceph source tree, default to $PWD/..
  --use-existing      do not setup/teardown a vstart cluster for testing

example:
  $prog_name --cbt ~/dev/cbt -a /tmp ../src/test/crimson/cbt/radosbench_4K_read.yaml
EOF
}

prog_name=$(basename $0)
archive_dir=$PWD/cbt-archive
build_dir=$PWD
source_dir=$(dirname $PWD)
use_existing=false
classical=false
opts=$(getopt --options "a:h" --longoptions "archive-dir:,build-dir:,source-dir:,cbt:,help,use-existing,classical" --name $prog_name -- "$@")
eval set -- "$opts"

while true; do
    case "$1" in
        -a|--archive-dir)
            archive_dir=$2
            shift 2
            ;;
        --build-dir)
            build_dir=$2
            shift 2
            ;;
        --source-dir)
            source_dir=$2
            shift 2
            ;;
        --cbt)
            cbt_dir=$2
            shift 2
            ;;
        --use-existing)
            use_existing=true
            shift
            ;;
        --classical)
            classical=true
            shift
            ;;
        -h|--help)
            usage $prog_name
            return 0
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "unexpected argument $1" 1>&2
            return 1
            ;;
    esac
done

if test $# -gt 0; then
    config_files="$@"
else
    echo "$prog_name: please specify one or more .yaml files" 1>&2
    usage $prog_name
    return 1
fi

if test -z "$cbt_dir"; then
    cbt_dir=$PWD/cbt
    git clone --depth 1 -b master https://github.com/ceph/cbt.git $cbt_dir
fi

# store absolute path before changing cwd
source_dir=$(readlink -f $source_dir)
if ! $use_existing; then
    cd $build_dir || exit
    # seastar uses 128*8 aio in reactor for io and 10003 aio for events pooling
    # for each core, if it fails to enough aio context, the seastar application
    # bails out. and take other process into consideration, let's make it
    # 32768 per core
    max_io=$(expr 32768 \* "$(nproc)")
    if test "$(/sbin/sysctl --values fs.aio-max-nr)" -lt $max_io; then
        sudo /sbin/sysctl -q -w fs.aio-max-nr=$max_io
    fi
    if $classical; then
        MDS=0 MGR=1 OSD=3 MON=1 $source_dir/src/vstart.sh -n -X \
           --without-dashboard
    else
        MDS=0 MGR=1 OSD=3 MON=1 $source_dir/src/vstart.sh -n -X \
           --without-dashboard --cyanstore \
           -o "memstore_device_bytes=34359738368" \
           --crimson --nodaemon --redirect-output \
           --osd-args "--memory 4G"
    fi
    cd - || exit
fi

# i need to read the performance events,
# see https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
if /sbin/capsh --supports=cap_sys_admin; then
    perf_event_paranoid=$(/sbin/sysctl --values kernel.perf_event_paranoid)
    if test $perf_event_paranoid -gt 0; then
        sudo /sbin/sysctl -q -w kernel.perf_event_paranoid=0
    fi
else
    echo "without cap_sys_admin, $(whoami) cannot read the perf events"
fi

for config_file in $config_files; do
    echo "testing $config_file"
    cbt_config=$(mktemp $config_file.XXXX.yaml)
    python3 $source_dir/src/test/crimson/cbt/t2c.py \
        --build-dir $build_dir \
        --input $config_file \
        --output $cbt_config
    python3 $cbt_dir/cbt.py \
        --archive $archive_dir \
        --conf $build_dir/ceph.conf \
        $cbt_config
    rm -f $cbt_config
done

if test -n "$perf_event_paranoid"; then
    # restore the setting
    sudo /sbin/sysctl -q -w kernel.perf_event_paranoid=$perf_event_paranoid
fi

if ! $use_existing; then
    cd $build_dir || exit
    if $classical; then
      $source_dir/src/stop.sh
    else
      $source_dir/src/stop.sh --crimson
    fi
fi