From ffb4f8679675ea51d468e82537cd31dbceb9b8ab Mon Sep 17 00:00:00 2001 From: "Kabanov, Dmitrii" Date: Tue, 14 Jul 2020 18:31:23 -0700 Subject: [PATCH] [ceph-client] Add OSD check before pool creation The PS adds the check of count of OSDs. It ensures that expected amount of OSDs is present at the moment of creation of a pool. The expected amount of OSDs is calculated based on target amount of OSDs and required percent of OSDs. Change-Id: Iadf36dbeca61c47d9a9db60cf5335e4e1cb7b74b --- ceph-client/templates/bin/pool/_init.sh.tpl | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/ceph-client/templates/bin/pool/_init.sh.tpl b/ceph-client/templates/bin/pool/_init.sh.tpl index 550dbcbe9..3f906eec8 100644 --- a/ceph-client/templates/bin/pool/_init.sh.tpl +++ b/ceph-client/templates/bin/pool/_init.sh.tpl @@ -46,6 +46,46 @@ function wait_for_inactive_pgs () { fi } +function check_osd_count() { + echo "#### Start: Checking OSD count ####" + noup_flag=$(ceph osd stat | awk '/noup/ {print $2}') + osd_stat=$(ceph osd stat -f json) + num_osd=$(jq '.osdmap.num_osds' <<< "$osd_stat") + num_in_osds=$(jq '.osdmap.num_in_osds' <<< "$osd_stat") + num_up_osds=$(jq '.osdmap.num_up_osds' <<< "$osd_stat") + EXPECTED_OSDS={{.Values.conf.pool.target.osd}} + REQUIRED_PERCENT_OF_OSDS={{.Values.conf.pool.target.required_percent_of_osds}} + + MIN_OSDS=$(($EXPECTED_OSDS*$REQUIRED_PERCENT_OF_OSDS/100)) + if [ ${MIN_OSDS} -lt 1 ]; then + MIN_OSDS=1 + fi + + if [ "${noup_flag}" ]; then + osd_status=$(ceph osd dump -f json | jq -c '.osds[] | .state') + count=0 + for osd in $osd_status; do + if [[ "$osd" == *"up"* || "$osd" == *"new"* ]]; then + ((count=count+1)) + fi + done + echo "Caution: noup flag is set. ${count} OSDs in up/new state. Required number of OSDs: ${MIN_OSDS}." + if [ $MIN_OSDS -gt $count ]; then + exit 1 + fi + else + if [ "${num_osd}" -eq 0 ]; then + echo "There are no osds in the cluster" + exit 1 + elif [ "${num_in_osds}" -ge "${MIN_OSDS}" ] && [ "${num_up_osds}" -ge "${MIN_OSDS}" ]; then + echo "Required number of OSDs (${MIN_OSDS}) are UP and IN status" + else + echo "Required number of OSDs (${MIN_OSDS}) are NOT UP and IN status. Cluster shows OSD count=${num_osd}, UP=${num_up_osds}, IN=${num_in_osds}" + exit 1 + fi + fi +} + function create_crushrule () { CRUSH_NAME=$1 CRUSH_RULE=$2 @@ -61,6 +101,7 @@ if [[ -z "$(ceph mon versions | grep ceph\ version | grep -v nautilus)" ]]; then ceph --cluster "${CLUSTER}" mon enable-msgr2 fi +check_osd_count {{- range $crush_rule := .Values.conf.pool.crush_rules -}} {{- with $crush_rule }} create_crushrule {{ .name }} {{ .crush_rule }} {{ .failure_domain }} {{ .device_class }}