Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

crush: verify weights is influenced by the number of replicas #13083

Merged
merged 1 commit into from Jan 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/test/crush/CMakeLists.txt
Expand Up @@ -12,3 +12,5 @@ add_executable(unittest_crush
)
add_ceph_unittest(unittest_crush ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crush)
target_link_libraries(unittest_crush global m ${BLKID_LIBRARIES})

add_ceph_test(crush_weights.sh ${CMAKE_CURRENT_SOURCE_DIR}/crush_weights.sh)
57 changes: 57 additions & 0 deletions src/test/crush/crush_weights.sh
@@ -0,0 +1,57 @@
#!/bin/bash

source $(dirname $0)/../detect-build-env-vars.sh
source $CEPH_ROOT/qa/workunits/ceph-helpers.sh

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