Project

General

Profile

Bug #38135 » create_rbd.sh

Bengen Tan, 02/01/2019 12:10 AM

 
#!/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"
(1-1/4)