mirror of
https://github.com/openzfs/zfs.git
synced 2025-10-01 02:46:29 +00:00

Historically, ZED has blindly spawned off zedlets in parallel and never worried about their completion order. This means that you can potentially have zedlets for event number 2 starting before zedlets for event number 1 had finished. Most of the time this is fine, and it actually helps a lot when the system is getting spammed with hundreds of events. However, there are times when you want your zedlets to be executed in sequence with the event ID. That is where synchronous zedlets come in. ZED will wait for all previously spawned zedlets to finish before running a synchronous zedlet. Synchronous zedlets are guaranteed to be the only zedlet running. No other zedlets may run in parallel with a synchronous zedlet. Users should be careful to only use synchronous zedlets when needed, since they decrease parallelism. To make a zedlet synchronous, simply add a "-sync-" immediately following the event name in the zedlet's file name: EVENT_NAME-sync-ZEDLETNAME.sh For example, if you wanted a synchronous statechange script: statechange-sync-myzedlet.sh Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #17335
65 lines
1.9 KiB
Bash
Executable File
65 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# shellcheck disable=SC3014,SC2154,SC2086,SC2034
|
|
#
|
|
# Turn off disk's enclosure slot if it becomes FAULTED.
|
|
#
|
|
# Bad SCSI disks can often "disappear and reappear" causing all sorts of chaos
|
|
# as they flip between FAULTED and ONLINE. If
|
|
# ZED_POWER_OFF_ENCLOSURE_SLOT_ON_FAULT is set in zed.rc, and the disk gets
|
|
# FAULTED, then power down the slot via sysfs:
|
|
#
|
|
# /sys/class/enclosure/<enclosure>/<slot>/power_status
|
|
#
|
|
# We assume the user will be responsible for turning the slot back on again.
|
|
#
|
|
# Note that this script requires that your enclosure be supported by the
|
|
# Linux SCSI Enclosure services (SES) driver. The script will do nothing
|
|
# if you have no enclosure, or if your enclosure isn't supported.
|
|
#
|
|
# Exit codes:
|
|
# 0: slot successfully powered off
|
|
# 1: enclosure not available
|
|
# 2: ZED_POWER_OFF_ENCLOSURE_SLOT_ON_FAULT disabled
|
|
# 3: vdev was not FAULTED
|
|
# 4: The enclosure sysfs path passed from ZFS does not exist
|
|
# 5: Enclosure slot didn't actually turn off after we told it to
|
|
|
|
[ -f "${ZED_ZEDLET_DIR}/zed.rc" ] && . "${ZED_ZEDLET_DIR}/zed.rc"
|
|
. "${ZED_ZEDLET_DIR}/zed-functions.sh"
|
|
|
|
if [ ! -d /sys/class/enclosure ] ; then
|
|
# No JBOD enclosure or NVMe slots
|
|
exit 1
|
|
fi
|
|
|
|
if [ "${ZED_POWER_OFF_ENCLOSURE_SLOT_ON_FAULT}" != "1" ] ; then
|
|
exit 2
|
|
fi
|
|
|
|
if [ "$ZEVENT_VDEV_STATE_STR" != "FAULTED" ] ; then
|
|
exit 3
|
|
fi
|
|
|
|
if [ ! -f "$ZEVENT_VDEV_ENC_SYSFS_PATH/power_status" ] ; then
|
|
exit 4
|
|
fi
|
|
|
|
# Turn off the slot and wait for sysfs to report that the slot is off.
|
|
# It can take ~400ms on some enclosures and multiple retries may be needed.
|
|
for i in $(seq 1 20) ; do
|
|
echo "off" | tee "$ZEVENT_VDEV_ENC_SYSFS_PATH/power_status"
|
|
|
|
for j in $(seq 1 5) ; do
|
|
if [ "$(cat $ZEVENT_VDEV_ENC_SYSFS_PATH/power_status)" == "off" ] ; then
|
|
break 2
|
|
fi
|
|
sleep 0.1
|
|
done
|
|
done
|
|
|
|
if [ "$(cat $ZEVENT_VDEV_ENC_SYSFS_PATH/power_status)" != "off" ] ; then
|
|
exit 5
|
|
fi
|
|
|
|
zed_log_msg "powered down slot $ZEVENT_VDEV_ENC_SYSFS_PATH for $ZEVENT_VDEV_PATH"
|