|
#!/bin/bash
|
|
#
|
|
# testing-create-500k-rbds-pB
|
|
#
|
|
# Version: 20181203-00
|
|
#
|
|
# Author: Victor Payno <vpayno@gaikai.com>
|
|
#
|
|
# Usage:
|
|
#
|
|
# Notes:
|
|
# - Precreate Data Files.
|
|
# - Create RBDs using dd.
|
|
#
|
|
|
|
declare -a VARGS=( $@ )
|
|
|
|
declare DATE
|
|
DATE="$(date +%Y%m%d-%H%M)"
|
|
|
|
declare -r MNTPNT_ROOT="/dev/shm"
|
|
declare -a OSD_POOLS=( "test-rbd0" )
|
|
declare -r LOG_DIR="/var/shared/ceph-testing/logs/${DATE}"
|
|
|
|
declare -i MAX_THREADS=50
|
|
|
|
declare -i IOSTAT_PID
|
|
declare -i DSTAT_PID
|
|
declare -i CEPH_HEALTH_PID
|
|
|
|
declare DAIMYO_VIP="$(upconf --show-context 2>/dev/null | jq -r .services.daimyo.fqdn)"
|
|
|
|
[[ -d ${LOG_DIR} ]] || mkdir -pv "${LOG_DIR}"
|
|
|
|
# Sanatize arguments so only variable assignments to true or false get through.
|
|
# shellcheck disable=SC2175
|
|
for i in $(eval echo {0..${#VARGS[@]}}); do
|
|
if ! echo "${VARGS[${i}]}" | grep -q -E '^[a-z_][a-z0-9_]+=(true|false)$'; then
|
|
unset VARGS["${i}"]
|
|
fi
|
|
done
|
|
|
|
rbd_exists()
|
|
{
|
|
local rbd_pool="${1}"
|
|
local rbd_name="${2}"
|
|
|
|
if rbd snap ls "${rbd_pool}/${rbd_name}" >& /dev/null; then
|
|
# If it exists return 0.
|
|
return 0
|
|
else
|
|
# If it doesn't exist return 1.
|
|
return 1
|
|
fi
|
|
} # rbd_exists()
|
|
|
|
create_rbds()
|
|
{
|
|
local osd_pool="${1}"
|
|
local -i counter=0
|
|
|
|
printf "\nCreating RBDs...\n\n"
|
|
|
|
for rank_id in {0..500010}; do
|
|
|
|
_create_rbd ${rank_id} "${osd_pool}" &
|
|
|
|
sleep 0.5s
|
|
|
|
let counter++
|
|
|
|
if [[ ${counter} -ge ${MAX_THREADS} ]]; then
|
|
time wait
|
|
counter=0
|
|
fi
|
|
|
|
done
|
|
|
|
time wait
|
|
|
|
rbd showmapped
|
|
|
|
printf "\n"
|
|
|
|
df -h | head -n 1
|
|
df -h | grep '/rbdtests/'
|
|
printf "\n"
|
|
|
|
printf "Finished creating RBDs.\n"
|
|
} # create_rbds()
|
|
|
|
_create_rbd()
|
|
{
|
|
local -i rank_id=${1}
|
|
local osd_pool="${2}"
|
|
|
|
#rbd_name="${osd_pool}/bench-${HOSTNAME}-slot_${rank_id}"
|
|
#rbd_name="${osd_pool}/$(printf "test%060d" ${rank_id})"
|
|
#rbd_name="${osd_pool}/$(printf "vpayno%058d" ${rank_id})"
|
|
rbd_name="${osd_pool}/$(printf "vpayno-sparse-%050d" ${rank_id})"
|
|
|
|
#if rbd ls ${osd_pool} | grep -q -E "^${rbd_name##*/}$"; then
|
|
if rbd_exists "${osd_pool}" "${rbd_name##*/}"; then
|
|
printf "RBD [%s] already exists, skipping creation...\n\n" "${rbd_name}"
|
|
return 0
|
|
else
|
|
printf "Creating RBD [%s]...\n" "${rbd_name}"
|
|
fi
|
|
|
|
printf "\n"
|
|
|
|
echo rbd create --size 20G --object-size 4M "${rbd_name}"
|
|
time rbd create --size 20G --object-size 4M "${rbd_name}" || return 0
|
|
|
|
sleep 1s
|
|
|
|
if [[ $(rbd lock list ${rbd_name} | wc -l) -ne 0 ]]; then
|
|
printf "This rbd is in use, skipping ...\n"
|
|
rbd lock list ${rbd_name}
|
|
continue
|
|
fi
|
|
|
|
printf "Creating RBD lock ...\n"
|
|
echo rbd lock add ${rbd_name} vpayno
|
|
time if ! rbd lock add ${rbd_name} vpayno; then
|
|
printf "Getting lock failed, skipping ...\n"
|
|
continue
|
|
fi
|
|
|
|
sleep 1s
|
|
|
|
echo rbd snap create "${rbd_name}@0"
|
|
time rbd snap create "${rbd_name}@0"
|
|
|
|
sleep 1s
|
|
|
|
echo rbd map "${rbd_name}"
|
|
bench_rbd_dev=$(time rbd map "${rbd_name}" 2>/dev/null) || return 0
|
|
|
|
sleep 1s
|
|
|
|
echo mkfs.ext4 -L "TEST${rank_id}" -O ^has_journal "${bench_rbd_dev}"
|
|
time mkfs.ext4 -L "TEST${rank_id}" -O ^has_journal "${bench_rbd_dev}" || return 1
|
|
|
|
sleep 1s
|
|
|
|
echo sync
|
|
time sync
|
|
|
|
sleep 1s
|
|
|
|
echo tune2fs -o discard "${bench_rbd_dev}"
|
|
time tune2fs -o discard "${bench_rbd_dev}" || return 1
|
|
|
|
sleep 1s
|
|
|
|
echo sync
|
|
time sync
|
|
|
|
sleep 1s
|
|
|
|
echo rbd unmap "${rbd_name}"
|
|
rbd unmap "${rbd_name}"
|
|
|
|
sleep 1s
|
|
|
|
rbd lock list ${rbd_name}
|
|
printf "Removing RBD lock ...\n"
|
|
echo rbd lock remove ${rbd_name} $(rbd lock list ${rbd_name} | awk '/^client/ { print $2" "$1 }')
|
|
time rbd lock remove ${rbd_name} $(rbd lock list ${rbd_name} | awk '/^client/ { print $2" "$1 }')
|
|
|
|
rbd lock list ${rbd_name}
|
|
} # _create_rbd()
|
|
|
|
start_ceph_health()
|
|
{
|
|
printf "Starting ceph health status collection...\n\n"
|
|
|
|
echo ceph health -w '>&' "${LOG_DIR}/kcs-rbd_test-${HOSTNAME}-${DATE}-ceph_watch.txt" '&'
|
|
time ceph health -w >& "${LOG_DIR}/kcs-rbd_test-${HOSTNAME}-${DATE}-ceph_watch.txt" &
|
|
|
|
sleep 1s
|
|
CEPH_HEALTH_PID=$!
|
|
|
|
disown %-
|
|
} # start_ceph_health()
|
|
|
|
stop_ceph_health()
|
|
{
|
|
printf "\n"
|
|
# shellcheck disable=SC2009
|
|
ps xau | grep "[c]eph"
|
|
printf "\n"
|
|
|
|
echo kill ${CEPH_HEALTH_PID}
|
|
time kill ${CEPH_HEALTH_PID}
|
|
|
|
sleep 1s
|
|
printf "\n"
|
|
# shellcheck disable=SC2009
|
|
ps xau | grep "[c]eph"
|
|
printf "Stopped Ceph health status collection.\n\n"
|
|
} # stop_ceph_health()
|
|
|
|
main()
|
|
{
|
|
local -a args=( $@ )
|
|
|
|
printf "Argument List\n\n"
|
|
printf "\t%s\n" "${args[@]}"
|
|
printf "\n"
|
|
|
|
# Set the script defined defaults.
|
|
local full=true
|
|
|
|
# Import user defined settings.
|
|
eval "${args[@]}"
|
|
|
|
touch "${LOG_DIR}/full"
|
|
|
|
printf "Staring on host %s @ %s\n\n" "${HOSTNAME}" "$(date)"
|
|
|
|
start_ceph_health
|
|
|
|
for osd_pool in "${OSD_POOLS[@]}"; do
|
|
create_rbds "${osd_pool}"
|
|
done
|
|
|
|
stop_ceph_health
|
|
|
|
printf "\nFinished on host %s @ %s\n" "${HOSTNAME}" "$(date)"
|
|
|
|
printf "\n"
|
|
|
|
jobs
|
|
|
|
kill $$
|
|
} # main()
|
|
|
|
time main "${VARGS[@]}" 2>&1 | tee "${LOG_DIR}/kcs-rbd_test-${HOSTNAME}-${DATE}-main.txt"
|