1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00
lvm2/test/shell/dmeventd-restart.sh
Zdenek Kabelac 8ce8e33a44 tests: better handling for dmeventd restart
Handle the case, where we  'kill -9' running dmeventd,
and restarting 'dmeventd -R' manages to still contact this
'zombie' damone and manages to get list of monitored devices
out of this and eventually 'run' new and in this case
unexpected instance of dmeventd.
2024-04-12 00:21:46 +02:00

116 lines
3.4 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
SKIP_WITH_LVMPOLLD=1
. lib/inittest
_restart_dmeventd() {
local pid=
#rm -f debug.log*
dmeventd -R -fldddd -e "$PWD/test_nologin" > debug.log_DMEVENTD_$RANDOM 2>&1 &
local local=$!
echo "$local" >LOCAL_DMEVENTD
for i in {1..50}; do
pid=$(pgrep -o dmeventd) || break
# Check pid and dmeventd readiness to communicate
test "$pid" = "$local" && dmeventd -i && break
sleep .2
done
if [ "$i" -eq 50 ]; then
# Unexpected - we waited over 10 seconds and
# dmeventd has not managed to restart
cat /run/dmeventd.pid || true
pgrep dmeventd || true
die "dmeventd restart is too slow"
fi
}
aux prepare_dmeventd
aux prepare_vg 5
lvcreate -aey --type mirror -m 3 --nosync --ignoremonitoring -l1 -n 4way $vg
lvchange --monitor y $vg/4way
lvcreate -aey --type mirror -m 2 --nosync --ignoremonitoring -l1 -n 3way $vg
lvchange --monitor y $vg/3way
lvcreate -aey -l1 -n $lv1 $vg
lvcreate -s -l1 -n $lv2 $vg/$lv1
_restart_dmeventd
check lv_field $vg/3way seg_monitor "monitored"
check lv_field $vg/4way seg_monitor "monitored"
lvchange --monitor y --verbose $vg/3way 2>&1 | tee lvchange.out
# only non-cluster tests can check command result
test -e LOCAL_CLVMD || grep 'already monitored' lvchange.out
lvchange --monitor y --verbose $vg/4way 2>&1 | tee lvchange.out
test -e LOCAL_CLVMD || grep 'already monitored' lvchange.out
# now try what happens if no dmeventd is running
pid=$(< LOCAL_DMEVENTD)
kill -9 "$pid"
# TODO/FIXME: it would be surely better, if the wait loop bellow would
# not be need however ATM the API for communication is not welldetecting
# this highly unusual race case - and things will simply timeout on
# reading failure within 4 seconds.
# Fixing would require to add some handling for losing FIFO connection
for i in {1..10}; do
# wait here for a while until dmeventd dies....
# suprisingly it's not instant and we can actually
# obtain list of monitored devices...
test -z $(ps -p "$pid" -o comm=) && break
sleep .1
done
rm LOCAL_DMEVENTD debug.log*
_restart_dmeventd
# now dmeventd should not be running
not pgrep dmeventd
rm LOCAL_DMEVENTD
# First lvs restarts 'dmeventd' (initiate a socket connection to a daemon)
check lv_field $vg/3way seg_monitor "not monitored"
pgrep -o dmeventd >LOCAL_DMEVENTD
check lv_field $vg/4way seg_monitor "not monitored"
lvchange --monitor y --verbose $vg/3way 2>&1 | tee lvchange.out
test -e LOCAL_CLVMD || not grep 'already monitored' lvchange.out
lvchange --monitor y --verbose $vg/$lv2 2>&1 | tee lvchange.out
test -e LOCAL_CLVMD || not grep 'already monitored' lvchange.out
_restart_dmeventd
kill -INT "$(< LOCAL_DMEVENTD)"
sleep 1
# dmeventd should be still present (although in 'exit-mode')
pgrep -o dmeventd
# Create a file simulating 'shutdown in progress'
touch test_nologin
sleep 2
# Should be now dead (within ~1 second)
not pgrep -o dmeventd
rm -f LOCAL_DMEVENTD
# Do not run dmeventd here again
vgremove -ff --config 'activation/monitoring = 0' $vg