summaryrefslogtreecommitdiffstats
path: root/src/test/crush/crush_weights.sh
blob: bf2bf8b0baffdf1c0fdebbd8888013ff4787d3b8 (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
#!/usr/bin/env bash

source $(dirname $0)/../detect-build-env-vars.sh

if [ `uname` = FreeBSD ]; then
    SED=gsed
else
    SED=sed
fi

read -r -d '' cm <<'EOF'
# devices
device 0 device0
device 1 device1
device 2 device2
device 3 device3
device 4 device4
# types
type 0 osd
type 1 domain
type 2 pool
# buckets
domain root {
    id -1        # do not change unnecessarily
    # weight 5.000
    alg straw2
    hash 0    # rjenkins1
    item device0 weight 10.0
    item device1 weight 10.0
    item device2 weight 10.0
    item device3 weight 10.0
    item device4 weight 1.000
}
# rules
rule data {
    ruleset 0
    type replicated
    min_size 1
    max_size 10
    step take root
    step choose firstn 0 type osd
    step emit
}
EOF

three=($(echo "$cm" | crushtool -c /dev/fd/0 --test --show-utilization \
                              --min-x 1 --max-x 1000000 --num-rep 3 | \
  grep "device \(0\|4\)" | $SED -e 's/^.*stored : \([0-9]\+\).*$/\1/'))

if test $(echo "scale=5; (10 - ${three[0]}/${three[1]}) < .75" | bc) = 1; then
    echo 3 replicas weights better distributed than they should be. 1>&2
    exit 1
fi

one=($(echo "$cm" | crushtool -c /dev/fd/0 --test --show-utilization \
                              --min-x 1 --max-x 1000000 --num-rep 1 | \
  grep "device \(0\|4\)" | $SED -e 's/^.*stored : \([0-9]\+\).*$/\1/'))

if test $(echo "scale=5; (10 - ${one[0]}/${one[1]}) > .1 || (10 - ${one[0]}/${one[1]}) < -.1" | bc) = 1; then
    echo 1 replica not distributed as they should be. 1>&2
    exit 1
fi