open-cas-linux/test/smoke_test/cas_functions
Robert Baldyga dff8f2f7b2 Update smoke_tests
As now exported object path is not printed for cores that do not have
active exported object, there are needed some changes in tests that
relied on previous behavior.

Replace exported object based lookup with cache_id/core_id pair.

Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
2022-03-28 12:43:57 +02:00

1104 lines
32 KiB
Bash

#!/bin/bash
#
# Copyright(c) 2012-2021 Intel Corporation
# SPDX-License-Identifier: BSD-3-Clause
#
############################################################
# CAS API #
############################################################
clear_config() {
check_options ${FUNCNAME[0]}
if [ -n "$STORE_CONFIG_OPTION" ] ; then
cp $CAS_CONFIG_PATH $TMP_DIR/`basename $CAS_CONFIG_PATH`
fi
echo "version=`$CAS -V -o csv | grep CLI | cut -d, -f2`" > "$CAS_CONFIG_PATH"
export CAS_CONFIG_VERSION_TAG=`head $CAS_CONFIG_PATH`
clear_options
}
restore_config() {
cp $TMP_DIR/`basename $CAS_CONFIG_PATH` $CAS_CONFIG_PATH
}
start_cache() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --start-cache --cache-device $CACHE_DEVICE_OPTION"
if [ -n "$CACHE_ID_OPTION" ] ; then
COMMAND="$COMMAND --cache-id $CACHE_ID_OPTION"
fi
if [ -n "$CACHE_FORCE_OPTION" ] ; then
COMMAND="$COMMAND --force"
fi
if [ -n "$CACHE_MODE_OPTION" ] ; then
COMMAND="$COMMAND --cache-mode $CACHE_MODE_OPTION"
fi
if [ -n "$CACHE_LOAD_METADATA_OPTION" ] ; then
COMMAND="$COMMAND --load"
fi
if [ -n "$CACHE_LINE_SIZE" ] ; then
COMMAND="$COMMAND --cache-line-size $CACHE_LINE_SIZE"
fi
run_cmd $COMMAND
clear_options
}
stop_cache() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --stop-cache --cache-id $CACHE_ID_OPTION"
if [ -n "$CACHE_DONT_FLUSH_DATA_OPTION" ] ; then
COMMAND="$COMMAND --no-data-flush"
fi
run_cmd $COMMAND
clear_options
}
set_cache_mode() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS -Q -c $CACHE_MODE_OPTION --cache-id $CACHE_ID_OPTION"
if [ -n "$CACHE_MODE_FLUSH_OPTION" ] ; then
COMMAND="$COMMAND --flush-cache yes"
else
COMMAND="$COMMAND --flush-cache no"
fi
run_cmd $COMMAND
clear_options
}
try_add_core() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --script --add-core --try-add --cache-id $CACHE_ID_OPTION --core-id $CORE_ID_OPTION --core-device $CORE_DEVICE_OPTION"
run_cmd $COMMAND
}
add_core() {
local RETRY=10
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --add-core --cache-id $CACHE_ID_OPTION --core-device $CORE_DEVICE_OPTION"
if [ -n "$CORE_TRY_ADD_OPTION" ] ; then
COMMAND="$COMMAND --try-add"
fi
run_cmd $COMMAND
if [ -n "$NEGATIVE_TEST_OPTION" ]; then
clear_options
return 0
fi
local i=0
local SHORT_LINK=$(realpath $CORE_DEVICE_OPTION)
local CAS_DEV=` casadm -L | egrep "^.core +[0-9]+ +$SHORT_LINK" | awk '{print $NF}'`
clear_options
while [ ! -e $CAS_DEV ]; do
sleep 2
let i++
if [ $i -gt $RETRY ]; then
error "Add core timeout"
end_test 1
fi
done
}
remove_core() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --remove-core --cache-id $CACHE_ID_OPTION --core-id $CORE_ID_OPTION"
run_cmd $COMMAND
clear_options
}
check_cache_state() {
check_options ${FUNCNAME[0]}
get_cache_device_entry() {
$CAS --list-caches -o csv | \
awk -F, -v cache=$CACHE_ID_OPTION '{
if ($1 == "cache" && $2 == cache) print $0;
}'
}
local COMMAND="get_cache_device_entry | grep $DEMANDED_STATE_OPTION &> /dev/null"
run_cmd $COMMAND
clear_options
}
check_core_state() {
check_options ${FUNCNAME[0]}
get_core_device_entry() {
$CAS --list-caches -o csv | \
awk -F, -v cache=$CACHE_ID_OPTION -v core=$CORE_ID_OPTION '{
if ($1 == "cache") curr_cache = $2;
if ($1 == "core") curr_core = $2;
if (curr_cache == cache && curr_core == core) print $0;
}'
}
local COMMAND="get_core_device_entry | grep $DEMANDED_STATE_OPTION &> /dev/null"
run_cmd $COMMAND
clear_options
}
check_device_in_core_pool() {
check_options ${FUNCNAME[0]}
get_core_pool_entry() {
$CAS --list-caches -o csv | \
awk -F, -v device=$(readlink -m $DEVICE_ID_OPTION) '{
if ($1 == "core pool") pool = 1;
if ($1 == "cache") pool = 0;
if (pool == 1 && $3 == device) print $0;
}'
}
local COMMAND="get_core_pool_entry | grep "Detached" &> /dev/null"
run_cmd $COMMAND
clear_options
}
get_stats_value() {
check_options ${FUNCNAME[0]}
if [ -n "$CORE_ID_OPTION" ] ; then
CORE_ID_OPTION="--core-id $CORE_ID_OPTION"
fi
if [ "$IO_CLASS_ID" = "all" ]; then
PART_ID_OPTION="--io-class-id"
elif [ -n "$IO_CLASS_ID" ] ; then
PART_ID_OPTION="--io-class-id $IO_CLASS_ID"
fi
SILENT_COMMAND_OPTION="1" run_cmd "$CAS --stats --output-format csv \
--cache-id $CACHE_ID_OPTION $CORE_ID_OPTION $PART_ID_OPTION | tail -2 | tr \",\" \"\n\""
local IFS_DEFAULT=$IFS
IFS=$'\n'
local STATS_ARRAY=()
local i=0
for line in $OUTPUT; do
STATS_ARRAY[$i]="$line"
i=$((i+1))
done
STATS_VALUES_LENGTH=${#STATS_ARRAY[@]}
STATS_VALUES_OFFSET=$((STATS_VALUES_LENGTH / 2))
local hits=0
for (( i=0; i<$STATS_VALUES_OFFSET; i++ ))
do
echo "${STATS_ARRAY[$i]}" | grep -i "$STAT_NAME_OPTION" | grep -v "%" \
| grep -i "$STAT_UNIT_OPTION" &> /dev/null
if [ $? -eq 0 ]; then
local value_id=$(( STATS_VALUES_OFFSET + i ))
OUTPUT="${STATS_ARRAY[$value_id]}"
hits=$((hits + 1))
fi
done
IFS=$IFS_DEFAULT
if [[ $hits -gt 1 ]] ; then
error "Given statistic name or unit is ambiguous!"
OUTPUT=""
end_test 1
fi
if [[ $hits -eq 0 ]] ; then
error "Given statistic name or unit not found!"
OUTPUT=""
end_test 1
fi
clear_options
}
init() {
check_options ${FUNCNAME[0]}
local L_NUMBER_OF_CACHE_PARTITIONS=1
local L_NUMBER_OF_CORE_PARTITIONS=1
local L_MAKE_FILE_SYSTEM
local MAX_NUMBER_OF_CORE_PARTITIONS=4
local L_CACHE_FORCE_OPTION
local L_CACHE_MODE_OPTION
local L_CACHE_LOAD_METADATA_OPTION
local L_CACHE_LINE_SIZE
local L_MAKE_PARTITIONS=${MAKE_PARTITIONS}
if [ -n "$NUMBER_OF_CACHE_PARTITIONS" ] ; then
L_NUMBER_OF_CACHE_PARTITIONS="$NUMBER_OF_CACHE_PARTITIONS"
fi
if [ -n "$NUMBER_OF_CORE_PARTITIONS" ] ; then
L_NUMBER_OF_CORE_PARTITIONS="$NUMBER_OF_CORE_PARTITIONS"
fi
if [ -n "$MAKE_FILE_SYSTEM" ] ; then
L_MAKE_FILE_SYSTEM="$MAKE_FILE_SYSTEM"
fi
if [ -n "$CACHE_FORCE_OPTION" ] ; then
L_CACHE_FORCE_OPTION="$CACHE_FORCE_OPTION"
fi
if [ -n "$CACHE_MODE_OPTION" ] ; then
L_CACHE_MODE_OPTION="$CACHE_MODE_OPTION"
fi
if [ -n "$CACHE_LOAD_METADATA_OPTION" ] ; then
L_CACHE_LOAD_METADATA_OPTION="$CACHE_LOAD_METADATA_OPTION"
fi
if [ -n "$CACHE_LINE_SIZE" ] ; then
L_CACHE_LINE_SIZE="$CACHE_LINE_SIZE"
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -gt $MAX_NUMBER_OF_CORE_PARTITIONS ] ; then
echo "You are trying start too many cache device!"
echo "Max number of cache device is 4."
L_NUMBER_OF_CACHE_PARTITIONS=4
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 4 ] || [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 3 ] ; then
MAX_NUMBER_OF_CORE_PARTITIONS=1
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 2 ] ; then
MAX_NUMBER_OF_CORE_PARTITIONS=2
fi
if [ -n "$PARTITION_CORE_SIZE_OPTION" ] ; then
L_PARTITION_CORE_SIZE_OPTION="$PARTITION_CORE_SIZE_OPTION"
else
L_PARTITION_CORE_SIZE_OPTION="$DEFAULT_CORE_SIZE"
fi
if [ -n "$PARTITION_CACHE_SIZE_OPTION" ] ; then
L_PARTITION_CACHE_SIZE_OPTION="$PARTITION_CACHE_SIZE_OPTION"
else
L_PARTITION_CACHE_SIZE_OPTION="$DEFAULT_CACHE_SIZE"
fi
if [ "1" == "$L_MAKE_PARTITIONS" ]
then
TARGET_DEVICE_OPTION="$CACHE_DEVICE" remove_partitions
TARGET_DEVICE_OPTION="$CORE_DEVICE" remove_partitions
local L_PARTITION_NUMBERS=$(seq 1 $L_NUMBER_OF_CACHE_PARTITIONS)
TARGET_DEVICE_OPTION="$CACHE_DEVICE" PARTITION_SIZE_OPTION="$L_PARTITION_CACHE_SIZE_OPTION" PARTITION_IDS_OPTION="$L_PARTITION_NUMBERS" make_primary_partitions
local L_PARTITION_NUMBERS=$(seq 1 $(( $L_NUMBER_OF_CACHE_PARTITIONS * $L_NUMBER_OF_CORE_PARTITIONS )))
TARGET_DEVICE_OPTION="$CORE_DEVICE" PARTITION_SIZE_OPTION="$L_PARTITION_CORE_SIZE_OPTION" PARTITION_IDS_OPTION="$L_PARTITION_NUMBERS" make_primary_partitions
fi
k=1
for ((i = 1 ; i <= L_NUMBER_OF_CACHE_PARTITIONS; i++)); do
if [ -n "$L_CACHE_FORCE_OPTION" ] ; then
CACHE_FORCE_OPTION="$L_CACHE_FORCE_OPTION"
fi
if [ -n "$L_CACHE_MODE_OPTION" ] ; then
CACHE_MODE_OPTION="$L_CACHE_MODE_OPTION"
fi
if [ -n "$L_CACHE_LOAD_METADATA_OPTION" ] ; then
CACHE_LOAD_METADATA_OPTION="$L_CACHE_LOAD_METADATA_OPTION"
fi
if [ -n "$L_CACHE_LINE_SIZE" ] ; then
CACHE_LINE_SIZE="$L_CACHE_LINE_SIZE"
fi
CACHE_ID_OPTION="$i" CACHE_DEVICE_OPTION="${CACHE_DEVICE}-part$i" start_cache
for ((j = 1; j <= L_NUMBER_OF_CORE_PARTITIONS && j <= MAX_NUMBER_OF_CORE_PARTITIONS; j++)); do
CACHE_ID_OPTION="$i" CORE_DEVICE_OPTION="${CORE_DEVICE}-part$k" add_core
k=`expr $k \+ 1`
done
done
if [ -n "$L_MAKE_FILE_SYSTEM" ] ; then
for ((i=1 ; i <= L_NUMBER_OF_CACHE_PARTITIONS; i++)); do
for ((j=1 ; j <= L_NUMBER_OF_CORE_PARTITIONS && j <= MAX_NUMBER_OF_CORE_PARTITIONS; j++)); do
TARGET_DEVICE_OPTION="${DEVICE_NAME}$i-$j" FILESYSTEM_TYPE="$L_MAKE_FILE_SYSTEM" make_filesystem
run_cmd "mount ${DEVICE_NAME}$i-$j ${MOUNTPOINT}-$i-$j"
done
done
fi
clear_options
}
iteration() {
check_options ${FUNCNAME[0]}
local L_NUMBER_OF_CACHE_PARTITIONS
local L_NUMBER_OF_CORE_PARTITIONS
local L_MAKE_FILE_SYSTEM="off"
local MAX_NUMBER_OF_CORE_PARTITIONS=4
local L_CACHE_FORCE_OPTION="off"
local L_CACHE_MODE_OPTION="off"
local L_CACHE_LOAD_METADATA_OPTION="off"
local L_CACHE_LINE_SIZE="off"
local L_MAKE_PARTITIONS=1
if [ -n "$NUMBER_OF_CACHE_PARTITIONS" ] ; then
L_NUMBER_OF_CACHE_PARTITIONS="$NUMBER_OF_CACHE_PARTITIONS"
fi
if [ -n "$NUMBER_OF_CORE_PARTITIONS" ] ; then
L_NUMBER_OF_CORE_PARTITIONS="$NUMBER_OF_CORE_PARTITIONS"
fi
if [ -n "$MAKE_FILE_SYSTEM" ] ; then
if [ "$MAKE_FILE_SYSTEM" == "all" ] ; then
L_MAKE_FILE_SYSTEM="ext3 ext4 xfs"
else
L_MAKE_FILE_SYSTEM="$MAKE_FILE_SYSTEM"
fi
fi
if [ -n "$CACHE_FORCE_OPTION" ] ; then
if [ "$CACHE_FORCE_OPTION" == "all" ] ; then
L_CACHE_MODE_OPTION="off on"
else
L_CACHE_FORCE_OPTION="$CACHE_FORCE_OPTION"
fi
fi
if [ -n "$CACHE_MODE_OPTION" ] ; then
if [ "$CACHE_MODE_OPTION" == "all" ] ; then
L_CACHE_MODE_OPTION="wa wb wt pt wo"
else
L_CACHE_MODE_OPTION="$CACHE_MODE_OPTION"
fi
fi
if [ -n "$CACHE_LOAD_METADATA_OPTION" ] ; then
if [ "$CACHE_LOAD_METADATA_OPTION" == "all" ] ; then
L_CACHE_LOAD_METADATA_OPTION="off on"
else
L_CACHE_LOAD_METADATA_OPTION="$CACHE_LOAD_METADATA_OPTION"
fi
fi
if [ -n "$CACHE_LINE_SIZE" ] ; then
if [ "$CACHE_LINE_SIZE" == "all" ] ; then
L_CACHE_LINE_SIZE="4 8 16 32 64"
else
L_CACHE_LINE_SIZE="$CACHE_LINE_SIZE"
fi
fi
iteration_number=1
for mode in $L_CACHE_MODE_OPTION; do
for cache_line_size_mode in $L_CACHE_LINE_SIZE; do
for filesystem in $L_MAKE_FILE_SYSTEM; do
for force in $L_CACHE_FORCE_OPTION; do
for load_metadata in $L_CACHE_LOAD_METADATA_OPTION; do
echo "--- Iteration $iteration_number ---"
echo "Configuration in this iteration is:"
if [ -n "$L_NUMBER_OF_CACHE_PARTITIONS" ] ; then
NUMBER_OF_CACHE_PARTITIONS="$L_NUMBER_OF_CACHE_PARTITIONS"
fi
if [ -n "$L_NUMBER_OF_CORE_PARTITIONS" ] ; then
NUMBER_OF_CORE_PARTITIONS="$L_NUMBER_OF_CORE_PARTITIONS"
fi
if [ "$mode" != "off" ] ; then
CACHE_MODE_OPTION="$mode"
echo "Cache mode : $mode"
fi
if [ "$cache_line_size_mode" != "off" ] ; then
CACHE_LINE_SIZE="$cache_line_size_mode"
echo "Cache_line_size : $cache_line_size_mode"
fi
if [ "$filesystem" != "off" ] ; then
MAKE_FILE_SYSTEM="$filesystem"
echo "Filesystem type : $filesystem"
fi
if [ "$force" == "on" ] ; then
CACHE_FORCE_OPTION="$force"
echo "Force option: on"
fi
if [ "$load_metadata" == "on" ] ; then
CACHE_LOAD_METADATA_OPTION="$load_metadata"
echo "Load metadata option: on"
else
L_MAKE_PARTITIONS=1
fi
MAKE_PARTITIONS=${L_MAKE_PARTITIONS}
init
$1
if [ $? -ne 0 ]
then
end_test 1
fi
L_MAKE_PARTITIONS=0
if [ -n "$L_NUMBER_OF_CACHE_PARTITIONS" ] ; then
NUMBER_OF_CACHE_PARTITIONS="$L_NUMBER_OF_CACHE_PARTITIONS"
fi
if [ -n "$L_NUMBER_OF_CORE_PARTITIONS" ] ; then
NUMBER_OF_CORE_PARTITIONS="$L_NUMBER_OF_CORE_PARTITIONS"
fi
deinit
iteration_number=`expr $iteration_number \+ 1`
done
done
done
done
done
clear_options
}
deinit() {
check_options ${FUNCNAME[0]}
local L_NUMBER_OF_CACHE_PARTITIONS=1
local L_NUMBER_OF_CORE_PARTITIONS=1
local MAX_NUMBER_OF_CORE_PARTITIONS=4
if [ -n "$NUMBER_OF_CACHE_PARTITIONS" ] ; then
L_NUMBER_OF_CACHE_PARTITIONS="$NUMBER_OF_CACHE_PARTITIONS"
fi
if [ -n "$NUMBER_OF_CORE_PARTITIONS" ] ; then
L_NUMBER_OF_CORE_PARTITIONS="$NUMBER_OF_CORE_PARTITIONS"
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -gt $MAX_NUMBER_OF_CORE_PARTITIONS ] ; then
echo "You are trying start too many cache device!"
echo "Max number of cache device is 4."
L_NUMBER_OF_CACHE_PARTITIONS=4
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 4 ] || [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 3 ] ; then
MAX_NUMBER_OF_CORE_PARTITIONS=1
fi
if [ $L_NUMBER_OF_CACHE_PARTITIONS -eq 2 ] ; then
MAX_NUMBER_OF_CORE_PARTITIONS=2
fi
for ((i=1 ; i <= L_NUMBER_OF_CACHE_PARTITIONS; i++)); do
for ((j=1 ; j <= L_NUMBER_OF_CORE_PARTITIONS && j <= MAX_NUMBER_OF_CORE_PARTITIONS; j++)); do
CHECK_MOUNTPOINT=`mount | grep ${MOUNTPOINT}-$i-$j`
if [ -n "$CHECK_MOUNTPOINT" ] ; then
run_cmd "umount ${MOUNTPOINT}-$i-$j"
fi
done
done
for ((i=1 ; i <= L_NUMBER_OF_CACHE_PARTITIONS; i++)); do
for ((j=1 ; j <= L_NUMBER_OF_CORE_PARTITIONS && j <= MAX_NUMBER_OF_CORE_PARTITIONS; j++)); do
CACHE_ID_OPTION="$i" CORE_ID_OPTION="$j" remove_core
done
CACHE_ID_OPTION="$i" stop_cache
done
clear_options
}
flush_cache() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --flush-cache --cache-id $CACHE_ID_OPTION"
run_cmd $COMMAND
clear_options
}
flush_core() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --flush-core --cache-id $CACHE_ID_OPTION --core-id $CORE_ID_OPTION"
run_cmd $COMMAND
clear_options
}
set_cleaning_policy() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --set-param --name cleaning --cache-id $CACHE_ID_OPTION \
--policy $CLEAN_POL_OPTION"
run_cmd $COMMAND
clear_options
}
get_cleaning_policy() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --get-param --name cleaning --cache-id $CACHE_ID_OPTION \
--output-format csv"
run_cmd $COMMAND
clear_options
}
set_promotion_policy() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --set-param --name promotion --cache-id $CACHE_ID_OPTION \
--policy $PROMO_POL_OPTION"
run_cmd $COMMAND
clear_options
}
check_promotion_policy() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --get-param --name promotion --cache-id $CACHE_ID_OPTION \
--output-format csv"
echo -n "$(date +%Y-%m-%d_%H:%M:%S) "
echo -n "Checking if promotion policy type set to '$PROMO_POL_OPTION'. "
PROMO_POL_VALUE=$($COMMAND | grep -i type | cut -d ',' -f2)
if [ -n "$NEGATIVE_TEST_OPTION" ] && [ "$NEGATIVE_TEST_OPTION" -ne 0 ] ; then
echo -n "(negative test) "
if [[ "$PROMO_POL_OPTION" != "$PROMO_POL_VALUE" ]] ; then
success
else
error
echo "Promotion policy type set to inadmissible value '$PROMO_POL_VALUE'!"
if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
end_test 1
fi
return 1
fi
else
if [[ "$PROMO_POL_OPTION" == "$PROMO_POL_VALUE" ]] ; then
success
else
error
echo "Promotion policy type do not match!"
if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
end_test 1
fi
return 1
fi
fi
clear_options
}
set_flush_params() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --set-param --name $CLEAN_POL_NS_OPTION --cache-id $CACHE_ID_OPTION"
if [ -n "$WAKE_UP_OPTION" ] ; then
COMMAND="$COMMAND --wake-up $WAKE_UP_OPTION"
fi
if [ -n "$STALE_TIME_OPTION" ] ; then
COMMAND="$COMMAND --staleness-time $STALE_TIME_OPTION"
fi
if [ -n "$FLUSH_BUFFERS_OPTION" ] ; then
COMMAND="$COMMAND --flush-max-buffers $FLUSH_BUFFERS_OPTION"
fi
if [ -n "$ACTIVITY_THRESH_OPTION" ] ; then
COMMAND="$COMMAND --activity-threshold $ACTIVITY_THRESH_OPTION"
fi
run_cmd $COMMAND
clear_options
}
get_flush_params() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --get-param --name $CLEAN_POL_NS_OPTION \
--cache-id $CACHE_ID_OPTION --output-format csv"
run_cmd $COMMAND
clear_options
}
set_promotion_params() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --set-param --name $PROMO_POL_NS_OPTION --cache-id $CACHE_ID_OPTION"
if [ -n "$THRESHOLD_OPTION" ] ; then
COMMAND="$COMMAND --threshold $THRESHOLD_OPTION"
fi
if [ -n "$TRIGGER_OPTION" ] ; then
COMMAND="$COMMAND --trigger $TRIGGER_OPTION"
fi
run_cmd $COMMAND
clear_options
}
check_promotion_params() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --get-param --name $PROMO_POL_NS_OPTION \
--cache-id $CACHE_ID_OPTION --output-format csv"
echo -n "$(date +%Y-%m-%d_%H:%M:%S) "
echo -n "Checking threshold and/or trigger values. "
if [ -z "$THRESHOLD_OPTION" ] && [ -z "$TRIGGER_OPTION" ] ; then
error
echo "No defined promotion policy option to check! "
if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
end_test 1
fi
return 1
fi
if [ -n "$THRESHOLD_OPTION" ] ; then
echo -n "THRESHOLD value = '$THRESHOLD_OPTION' "
THRESHOLD_VALUE=$($COMMAND | grep -i threshold | cut -d ',' -f2)
if [ "$THRESHOLD_OPTION" -ne "$THRESHOLD_VALUE" ] ; then
THRESHOLD_VALUE_ERROR="Threshold value do not match!"
fi
fi
if [ -n "$TRIGGER_OPTION" ] ; then
echo -n "TRIGGER value = '$TRIGGER_OPTION' "
TRIGGER_VALUE=$($COMMAND | grep -i trigger | cut -d ',' -f2)
if [ "$TRIGGER_OPTION" -ne "$TRIGGER_VALUE" ] ; then
TRIGGER_VALUE_ERROR="Trigger value do not match!"
fi
fi
if [ -n "$NEGATIVE_TEST_OPTION" ] && [ "$NEGATIVE_TEST_OPTION" -ne 0 ] ; then
echo -n "(negative test) "
if [ -n "$THRESHOLD_VALUE_ERROR" ] || [ -n "$TRIGGER_VALUE_ERROR" ] ; then
success
else
error
echo "Given values match!"
if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
end_test 1
fi
return 1
fi
else
if [ -z "$THRESHOLD_VALUE_ERROR" ] && [ -z "$TRIGGER_VALUE_ERROR" ] ; then
success
else
error
echo -e "$THRESHOLD_VALUE_ERROR\n$TRIGGER_VALUE_ERROR"
if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
end_test 1
fi
return 1
fi
fi
clear_options
}
dirty_stop() {
check_options ${FUNCNAME[0]}
local L_CACHE_DEVICE_OPTION = $CACHE_DEVICE_OPTION
CACHE_DEVICE_OPTION=$L_CACHE_DEVICE_OPTION turn_off_device
local COMMAND="$CAS --stop-cache --cache-id $CACHE_ID_OPTION"
sleep 1
run_cmd $COMMAND
sleep 1
CACHE_DEVICE_OPTION=$L_CACHE_DEVICE_OPTION turn_on_device
clear_options
}
check_no_cache_running() {
run_cmd "$CAS -L | grep 'No caches running'"
clear_options
}
export -f clear_config
export -f restore_config
export -f start_cache
export -f stop_cache
export -f set_cache_mode
export -f add_core
export -f try_add_core
export -f remove_core
export -f check_cache_state
export -f check_core_state
export -f check_device_in_core_pool
export -f get_stats_value
export -f init
export -f iteration
export -f deinit
export -f flush_core
export -f flush_cache
export -f set_flush_params
export -f get_flush_params
export -f set_cleaning_policy
export -f get_cleaning_policy
export -f set_promotion_params
export -f check_promotion_params
export -f set_promotion_policy
export -f check_promotion_policy
export -f dirty_stop
export -f check_no_cache_running
############################################################
# SYSTEM FUNCTIONS #
############################################################
mount_cache() {
check_options ${FUNCNAME[0]}
DIR="${MOUNTPOINT}-${CACHE_ID_OPTION}-${CORE_ID_OPTION}"
if [ ! -d $DIR ] ; then
mkdir $DIR
fi
if [ -n $(mount | grep "$DIR") ] ; then
umount $DIR 2> /dev/null
fi
local COMMAND="mount ${DEVICE_NAME}${CACHE_ID_OPTION}-${CORE_ID_OPTION} $DIR"
run_cmd $COMMAND
clear_options
}
remove_partitions() {
check_options ${FUNCNAME[0]}
local DEV_NAME=$(echo $TARGET_DEVICE_OPTION | sed 's/\/.*\///')
local SFDISK_CFG="$TMP_DIR/${DEV_NAME}_sfdisk.cfg"
local COMMAND="dd if=/dev/zero of=$TARGET_DEVICE_OPTION bs=4k count=10"
yes | rm -r $SFDISK_CFG 2>/dev/null
run_cmd $COMMAND
clear_options
}
make_primary_partitions() {
check_options ${FUNCNAME[0]}
local RETRY=40
local DEV_NAME=${TARGET_DEVICE_OPTION}
local SFDISK_CFG="$TMP_DIR/${DEV_NAME}_sfdisk.cfg"
local COMMAND="sfdisk -D -uM $TARGET_DEVICE_OPTION < $SFDISK_CFG"
local MAX_RETRY=4
local START="2048"
local END=""
local PART_NUM=0
local RET=1
local i
run_cmd parted -s $DEV_NAME mktable gpt
for PARTITION_ID in $PARTITION_IDS_OPTION ; do
i=0
if [[ $PARTITION_SIZE_OPTION == *[^0-9] ]] ; then
local BYTES=$(($(get_bytes $PARTITION_SIZE_OPTION)/512))
fi
if [[ $PARTITION_ID -eq 1 ]] ; then
END=$(($BYTES + $START))
fi
while [[ $RET -ne 0 && $i -lt $MAX_RETRY ]] ; do
echo -n "parted -s -a optimal $DEV_NAME mkpart primary ${START}s ${END}s "
parted -s -a optimal $DEV_NAME mkpart primary ${START}s ${END}s
RET=$?
if [[ $RET -ne 0 ]] ; then
sleep 2
let i++
fi
done
if [[ $RET -ne 0 ]] ; then
warning "Parted can't inform kernel about changes in partition table"
else
success
RET=1
fi
START=$(($END + 2048))
END=$(($START + $BYTES))
let PART_NUM++
done
run_cmd "udevadm settle"
i=0
for ID in `seq 1 $PART_NUM`; do
local i=0
local TEST_DEV="${DEV_NAME}-part${ID}"
local TEST_DEV_P="${DEV_NAME}-part${ID}"
while ! [[ -L $TEST_DEV || -L $TEST_DEV_P ]] ; do
# make sure that partition is detected if it was created
partprobe
sleep 1
let i++
if [ $i -gt $MAX_RETRY ]; then
clear_options
error "Creating partition ${TEST_DEV} failed"
end_test 1
fi
done
# Create symlink for NVMe
if [[ $TARGET_DEVICE_OPTION == "/dev/nvme"* ]] ; then
ln -sf "$TEST_DEV_P" "$TEST_DEV"
fi
# partition successfully created.,
# erase all filesystem/cas cache metadata that may have existed on it
# before.
if [ -L $TEST_DEV ]
then
run_cmd dd if=/dev/zero of="${TEST_DEV}" bs=1M count=1 oflag=direct
else
run_cmd dd if=/dev/zero of="${TEST_DEV_P}" bs=1M count=1 oflag=direct
fi
done
run_cmd "udevadm settle"
clear_options
}
make_filesystem() {
check_options ${FUNCNAME[0]}
local L_LABEL=""
if [ "$FILESYSTEM_LABEL" != "" ]; then
L_LABEL="-L $FILESYSTEM_LABEL"
fi
case $FILESYSTEM_TYPE in
"ext3" )
local COMMAND="mkfs.ext3 ${L_LABEL} $TARGET_DEVICE_OPTION"
;;
"ext4" )
hash mkfs.ext4 2> /dev/null && [ ! -e /etc/SuSE-release ] #ext4 is not supported on SLES
if [ $? -eq 0 ] ; then
local COMMAND="mkfs.ext4 ${L_LABEL} $TARGET_DEVICE_OPTION"
else
local COMMAND="mkfs.ext3 ${L_LABEL} $TARGET_DEVICE_OPTION"
warning "EXT4 not found or SLES detected , using EXT3 instead"
fi
;;
"xfs" )
hash mkfs.xfs 2> /dev/null
if [ $? -eq 0 ] ; then
local COMMAND="mkfs.xfs ${L_LABEL} -f -b size=4096 $TARGET_DEVICE_OPTION"
else
local COMMAND="mkfs.ext3 ${L_LABEL} $TARGET_DEVICE_OPTION"
warning "XFS not found, using EXT3 instead"
fi
;;
* )
error "Unrecognized filesystem $FILESYSTEM_TYPE"
esac
run_cmd $COMMAND
clear_options
}
# Removes all caches which use the cache device. This should be used in cleanup after each test
# so that if the test fails, it won't make other tests fail.
remove_caches() {
SILENT_COMMAND_OPTION="1"
CACHE_IDS_TO_REMOVE=$(${CAS} -L | grep $CACHE_DEVICE | awk '{print $2}')
for ID in $CACHE_IDS_TO_REMOVE ; do
# Umount all mounted instances first
DEVICES_TO_UMOUNT="$(mount | grep "/dev/${DEVICE_NAME}${ID}-" | awk '{print $1}')"
for DEVICE_TO_UMOUNT in $DEVICES_TO_UMOUNT ; do
umount $DEVICE_TO_UMOUNT
done
CACHE_ID_OPTION="$ID"
CACHE_DONT_FLUSH_DATA_OPTION="yes"
# Stop the cache!
stop_cache
done
# Remove detached cores from core pool
CORE_DEVICES_TO_REMOVE=$(${CAS} -L | grep $CORE_DEVICE | awk '{print $3}')
for DEVICE in $CORE_DEVICES_TO_REMOVE ; do
local COMMAND="$CAS --remove-detached -d $DEVICE"
run_cmd $COMMAND
done
if [ -n "$CACHE_IDS_TO_REMOVE" ] || [ -n "$CORE_DEVICES_TO_REMOVE" ] ; then
warning "Had to remove some caches in cleanup - \
either the test failed or it doesn't clean up after itself!"
fi
clear_options
}
turn_on_device() {
# Use realpath resolved before turning off device
check_options ${FUNCNAME[0]}
if [[ $CACHE_DEVICE_OPTION == "/dev/nvme"* ]] ; then
turn_on_nvme_device
else
COMMAND="echo 'running' > /sys/block/${CACHE_DEVICE_OPTION:4}/device/state"
run_cmd $COMMAND
fi
clear_options
}
turn_off_device() {
check_options ${FUNCNAME[0]}
SHORT_LINK=$(realpath $CACHE_DEVICE_OPTION)
if [[ $SHORT_LINK == "/dev/nvme"* ]] ; then
turn_off_nvme_device
else
local COMMAND="echo 'offline' > /sys/block/${SHORT_LINK:4}/device/state"
run_cmd $COMMAND
fi
}
turn_off_nvme_device() {
check_options ${FUNCNAME[0]}
SHORT_LINK=$(realpath $CACHE_DEVICE_OPTION)
COMMAND="echo '1' > /sys/block/${SHORT_LINK:4}/device/device/remove"
run_cmd $COMMAND
clear_options
}
turn_on_nvme_device() {
check_options ${FUNCNAME[0]}
local COMMAND="echo '1' > /sys/bus/pci/rescan"
run_cmd $COMMAND
sleep 30
}
check_is_nvme_atomic() {
check_options ${FUNCNAME[0]}
nvme id-ns $DEVICE_OPTION | grep "ms:8.*ds:9.*(in use)" &> /dev/null
return $?
}
io_class_list() {
check_options ${FUNCNAME[0]}
local COMMAND="CASADM_NO_LINE_BREAK='t' LANG='C' $CAS --io-class --list --cache-id $CACHE_ID_OPTION"
if [ -n "$CSV_FILE" ] ; then
COMMAND="$COMMAND --output-format csv > $CSV_FILE"
fi
run_cmd $COMMAND
clear_options
}
io_class_load() {
check_options ${FUNCNAME[0]}
run_cmd $CAS --io-class --load-config --file $CSV_FILE --cache-id $CACHE_ID_OPTION
clear_options
}
io_class_stats() {
check_options ${FUNCNAME[0]}
local COMMAND="$CAS --stats --cache-id $CACHE_ID_OPTION --io-class-id"
if [ -n "$IO_CLASS_ID" ] ; then
COMMAND="$COMMAND $IO_CLASS_ID"
fi
if [ -n "$CSV_FILE" ] ; then
COMMAND="$COMMAND --output-format csv > $CSV_FILE"
fi
run_cmd $COMMAND
clear_options
}
stats() {
check_options ${FUNCNAME[0]}
run_cmd $CAS --stats --cache-id $CACHE_ID_OPTION
clear_options
}
check_fio_ver() {
check_options ${FUNCNAME[0]}
fio_ver="$(fio -v)"
if [ -z $fio_ver ] ; then
echo_yellow "Fio is not installed, skipping test!"
return 1
fi
major=`echo $fio_ver | cut -d '.' -f 1 | cut -d '-' -f 2`
minor=`echo $fio_ver | cut -d '.' -f 2`
if [[ $major -lt $FIO_MAJOR_OPTION ]] ; then
echo_yellow "Invalid fio version, skipping test!"
return 1
elif [[ $major -eq $FIO_MAJOR_OPTION ]] && \
[[ $minor -lt $FIO_MINOR_OPTION ]] ; then
echo_yellow "Invalid fio minor revision, skipping test!"
return 1
fi
clear_options
return 0
}
check_kernel_ver() {
check_options ${FUNCNAME[0]}
kernel_ver="$(uname -r)"
kernel_version=`echo ${kernel_ver} | cut -d '.' -f 1`
major=`echo ${kernel_ver} | cut -d '.' -f 2`
if [[ $kernel_version -lt $KERNEL_VER_OPTION ]] ; then
echo_yellow "Invalid kernel version, skipping test!"
return 1
elif [[ $kernel_version -eq $KERNEL_VER_OPTION ]] && \
[[ $major -lt $KERNEL_MAJOR_OPTION ]] ; then
echo_yellow "Invalid kernel major revision, skipping test!"
return 1
fi
clear_options
return 0
}
export -f mount_cache
export -f remove_partitions
export -f make_primary_partitions
export -f remove_caches
export -f make_filesystem
export -f turn_on_device
export -f turn_off_device
export -f turn_on_nvme_device
export -f turn_off_nvme_device
export -f io_class_list
export -f io_class_load
export -f stats
export -f io_class_stats
export -f check_is_nvme_atomic
export -f check_fio_ver
export -f check_kernel_ver
export CAS_FUNCTIONS_LOADED="1"
echo "--- Open CAS API library loaded ---"