echo "Missing xmlstarlet binary!"
exit 1
fi
+
if [ `uname` = FreeBSD ]; then
SED=gsed
+ DIFFCOLOPTS=""
else
SED=sed
-fi
+ termwidth=$(stty -a | head -1 | sed -e 's/.*columns \([0-9]*\).*/\1/')
+ if [ -n "$termwidth" -a "$termwidth" != "0" ]; then
+ termwidth="-W ${termwidth}"
+ fi
+ DIFFCOLOPTS="-y $termwidth"
+fi
#! @file ceph-helpers.sh
# @brief Toolbox to manage Ceph cluster dedicated to testing
# @param delays sequence of sleep times before failure
#
function kill_daemon() {
- set -x
local pid=$(cat $1)
local send_signal=$2
local delays=${3:-0.1 0.2 1 1 1 2 3 5 5 5 10 10 20 60 60 60 120}
mkdir -p $osd_data
ceph-disk $ceph_disk_args \
- prepare $osd_data || return 1
+ prepare --filestore $osd_data || return 1
activate_osd $dir $id "$@"
}
ceph-disk $ceph_disk_args \
prepare --bluestore $osd_data || return 1
- local ceph_osd_args
- ceph_osd_args+=" --enable-experimental-unrecoverable-data-corrupting-features=bluestore"
- activate_osd $dir $id $ceph_osd_args "$@"
+ activate_osd $dir $id "$@"
}
function test_run_osd() {
ceph_disk_args+=" --prepend-to-path="
local ceph_args="$CEPH_ARGS"
- ceph_args+=" --enable-experimental-unrecoverable-data-corrupting-features=bluestore"
ceph_args+=" --osd-failsafe-full-ratio=.99"
ceph_args+=" --osd-journal-size=100"
ceph_args+=" --osd-scrub-load-threshold=2000"
local poolname=$1
local objectname=$2
- local osds=$(ceph --format xml osd map $poolname $objectname 2>/dev/null | \
- $XMLSTARLET sel -t -m "//acting/osd" -v . -o ' ')
+ local osds=$(ceph --format json osd map $poolname $objectname 2>/dev/null | \
+ jq '.acting | .[]')
# get rid of the trailing space
echo $osds
}
local poolname=$1
local objectname=$2
- ceph --format xml osd map $poolname $objectname 2>/dev/null | \
- $XMLSTARLET sel -t -m "//pgid" -v . -n
+ ceph --format json osd map $poolname $objectname 2>/dev/null | jq -r '.pgid'
}
function test_get_pg() {
local config=$3
CEPH_ARGS='' \
- ceph --format xml daemon $dir/ceph-$daemon.$id.asok \
+ ceph --format json daemon $dir/ceph-$daemon.$id.asok \
config get $config 2> /dev/null | \
- $XMLSTARLET sel -t -m "//$config" -v . -n
+ jq -r ".$config"
}
function test_get_config() {
local config=$3
local value=$4
- CEPH_ARGS='' \
- ceph --format xml daemon $dir/ceph-$daemon.$id.asok \
- config set $config $value 2> /dev/null | \
- $XMLSTARLET sel -Q -t -m "//success" -v .
+ test $(env CEPH_ARGS='' ceph --format json daemon $dir/ceph-$daemon.$id.asok \
+ config set $config $value 2> /dev/null | \
+ jq 'has("success")') == true
}
function test_set_config() {
local poolname=$1
local objectname=$2
- ceph --format xml osd map $poolname $objectname 2>/dev/null | \
- $XMLSTARLET sel -t -m "//acting_primary" -v . -n
+ ceph --format json osd map $poolname $objectname 2>/dev/null | \
+ jq '.acting_primary'
}
function test_get_primary() {
local objectname=$2
local primary=$(get_primary $poolname $objectname)
- ceph --format xml osd map $poolname $objectname 2>/dev/null | \
- $XMLSTARLET sel -t -m "//acting/osd[not(.='$primary')]" -v . -n | \
- head -1
+ ceph --format json osd map $poolname $objectname 2>/dev/null | \
+ jq ".acting | map(select (. != $primary)) | .[0]"
}
function test_get_not_primary() {
journal_args=" --journal-path $osd_data/journal"
fi
ceph-objectstore-tool \
- --enable-experimental-unrecoverable-data-corrupting-features=bluestore \
--data-path $osd_data \
$journal_args \
"$@" || return 1
# @return 0 if recovery in progress, 1 otherwise
#
function get_is_making_recovery_progress() {
- local progress=$(ceph --format xml status 2>/dev/null | \
- $XMLSTARLET sel \
- -t -m "//pgmap/recovering_keys_per_sec" -v . -o ' ' \
- -t -m "//pgmap/recovering_bytes_per_sec" -v . -o ' ' \
- -t -m "//pgmap/recovering_objects_per_sec" -v .)
- test -n "$progress"
+ local recovery_progress
+ recovery_progress+=".recovering_keys_per_sec + "
+ recovery_progress+=".recovering_bytes_per_sec + "
+ recovery_progress+=".recovering_objects_per_sec"
+ local progress=$(ceph --format json status 2>/dev/null | \
+ jq -r ".pgmap | $recovery_progress")
+ test "$progress" != null
}
function test_get_is_making_recovery_progress() {
# @return 0 on success, 1 on error
#
function get_num_active_clean() {
- local expression="("
- expression+="contains(.,'active') and "
- expression+="contains(.,'clean') and "
- expression+="not(contains(.,'stale'))"
- expression+=")"
- # xmlstarlet 1.3.0 (which is on Ubuntu precise)
- # add extra new lines that must be ignored with
- # grep -v '^$'
- ceph --format xml pg dump pgs 2>/dev/null | \
- $XMLSTARLET sel -t -m "//pg_stat/state[$expression]" -v . -n | \
- grep -cv '^$'
+ local expression
+ expression+="select(contains(\"active\") and contains(\"clean\")) | "
+ expression+="select(contains(\"stale\") | not)"
+ ceph --format json pg dump pgs 2>/dev/null | \
+ jq "[.[] | .state | $expression] | length"
}
function test_get_num_active_clean() {
# @return 0 on success, 1 on error
#
function get_num_pgs() {
- ceph --format xml status 2>/dev/null | \
- $XMLSTARLET sel -t -m "//pgmap/num_pgs" -v .
+ ceph --format json status 2>/dev/null | jq '.pgmap.num_pgs'
}
function test_get_num_pgs() {
function get_last_scrub_stamp() {
local pgid=$1
local sname=${2:-last_scrub_stamp}
- ceph --format xml pg dump pgs 2>/dev/null | \
- $XMLSTARLET sel -t -m "//pg_stat[pgid='$pgid']/$sname" -v .
+ ceph --format json pg dump pgs 2>/dev/null | \
+ jq -r ".[] | select(.pgid==\"$pgid\") | .$sname"
}
function test_get_last_scrub_stamp() {
local cur_active_clean
local -a delays=($(get_timeout_delays $TIMEOUT .1))
local -i loop=0
- test $(get_num_pgs) != 0 || return 1
+
+ while test $(get_num_pgs) == 0 ; do
+ sleep 1
+ done
while true ; do
# Comparing get_num_active_clean & get_num_pgs is used to determine
setup $dir || return 1
run_mon $dir a --osd_pool_default_size=1 --osd_failsafe_full_ratio=.99 --mon_pg_warn_min_per_osd=0 || return 1
- run_mgr $dir x || return 1
+ run_mgr $dir x --mon_pg_warn_min_per_osd=0 || return 1
! TIMEOUT=1 wait_for_health_ok || return 1
run_osd $dir 0 || return 1
wait_for_health_ok || return 1
if [ ! -z "$pids" ]; then return 1; fi
}
+function flush_pg_stats()
+{
+ local timeout=${1:-$TIMEOUT}
+
+ ids=`ceph osd ls`
+ seqs=''
+ for osd in $ids; do
+ seq=`ceph tell osd.$osd flush_pg_stats`
+ seqs="$seqs $osd-$seq"
+ done
+
+ for s in $seqs; do
+ osd=`echo $s | cut -d - -f 1`
+ seq=`echo $s | cut -d - -f 2`
+ echo "waiting osd.$osd seq $seq"
+ while test $(ceph osd last-stat-seq $osd) -lt $seq; do
+ sleep 1
+ if [ $((timeout--)) -eq 0 ]; then
+ return 1
+ fi
+ done
+ done
+}
+
+function test_flush_pg_stats()
+{
+ local dir=$1
+
+ setup $dir || return 1
+ run_mon $dir a --osd_pool_default_size=1 || return 1
+ run_mgr $dir x || return 1
+ run_osd $dir 0 || return 1
+ rados -p rbd put obj /etc/group
+ flush_pg_stats
+ local jq_filter='.pools | .[] | select(.name == "rbd") | .stats'
+ raw_bytes_used=`ceph df detail --format=json | jq "$jq_filter.raw_bytes_used"`
+ bytes_used=`ceph df detail --format=json | jq "$jq_filter.bytes_used"`
+ test $raw_bytes_used > 0 || return 1
+ test $raw_bytes_used == $bytes_used || return 1
+}
+
#######################################################################
##