#!/bin/sh . "${TEST_SCRIPTS_DIR}/unit.sh" tfile="${CTDB_TEST_TMP_DIR}/tunable.$$" remove_files () { rm -f "$tfile" } test_cleanup remove_files defaults="\ SeqnumInterval=1000 ControlTimeout=60 TraverseTimeout=20 KeepaliveInterval=5 KeepaliveLimit=5 RecoverTimeout=30 RecoverInterval=1 ElectionTimeout=3 TakeoverTimeout=9 MonitorInterval=15 TickleUpdateInterval=20 EventScriptTimeout=30 MonitorTimeoutCount=20 RecoveryGracePeriod=120 RecoveryBanPeriod=300 DatabaseHashSize=100001 DatabaseMaxDead=5 RerecoveryTimeout=10 EnableBans=1 NoIPFailback=0 VerboseMemoryNames=0 RecdPingTimeout=60 RecdFailCount=10 LogLatencyMs=0 RecLockLatencyMs=1000 RecoveryDropAllIPs=120 VacuumInterval=10 VacuumMaxRunTime=120 RepackLimit=10000 VacuumFastPathCount=60 MaxQueueDropMsg=1000000 AllowUnhealthyDBRead=0 StatHistoryInterval=1 DeferredAttachTO=120 AllowClientDBAttach=1 FetchCollapse=1 HopcountMakeSticky=50 StickyDuration=600 StickyPindown=200 NoIPTakeover=0 DBRecordCountWarn=100000 DBRecordSizeWarn=10000000 DBSizeWarn=100000000 PullDBPreallocation=10485760 LockProcessesPerDB=200 RecBufferSizeLimit=1000000 QueueBufferSize=1024 IPAllocAlgorithm=2 AllowMixedVersions=0 " ok_tunable_defaults () { ok "$defaults" } # Set required output to a version of $defaults where values for # tunables specified in $tfile replace the default values ok_tunable () { # Construct a version of $defaults prepended with a lowercase # version of the tunable variable, to allow case-insensitive # matching. This would be easier with the GNU sed # case-insensitivity flag, but that is less portable. The $0 # condition in awk causes empty lines to be skipped, in case # there are trailing empty lines in $defaults. _map=$(echo "$defaults" | awk -F= '$0 { printf "%s:%s=%s\n", tolower($1), $1, $2 }') # Replace values for tunables set in $tfile while IFS='= ' read -r _var _val ; do case "$_var" in \#* | "") continue ;; esac _decval=$((_val)) _vl=$(echo "$_var" | tr '[:upper:]' '[:lower:]') _map=$(echo "$_map" | sed -e "s|^\\(${_vl}:.*=\\).*\$|\\1${_decval}|") done <"$tfile" # Set result, stripping off lowercase tunable prefix ok "$(echo "$_map" | awk -F: '{ print $2 }')" } test_case "Unreadable file" : >"$tfile" chmod a-r "$tfile" uid=$(id -u) # root can read unreadable files if [ "$uid" = 0 ]; then ok_tunable_defaults else required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" required_error EINVAL <"$tfile" <"$tfile" <"$tfile" ok_tunable_defaults unit_test tunable_test "$tfile" test_case "OK, comments and blanks only" cat >"$tfile" <"$tfile" <"$tfile" <"$tfile" <"$tfile" <"$tfile" <"$tfile" <"$tfile" <