From eea2591bcc750df4bb44eee593a350764b341ea5 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Fri, 3 Apr 2026 09:46:16 +0300 Subject: [PATCH] Fix John GPU stress duration semantics --- iso/overlay/usr/local/bin/bee-john-gpu-stress | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/iso/overlay/usr/local/bin/bee-john-gpu-stress b/iso/overlay/usr/local/bin/bee-john-gpu-stress index 8010875..f3803bb 100644 --- a/iso/overlay/usr/local/bin/bee-john-gpu-stress +++ b/iso/overlay/usr/local/bin/bee-john-gpu-stress @@ -1,10 +1,11 @@ #!/bin/sh set -eu -SECONDS=300 +DURATION_SEC=300 DEVICES="" EXCLUDE="" FORMAT="" +TEST_SLICE_SECONDS=300 JOHN_DIR="/usr/local/lib/bee/john/run" JOHN_BIN="${JOHN_DIR}/john" export OCL_ICD_VENDORS="/etc/OpenCL/vendors" @@ -116,7 +117,7 @@ ensure_opencl_ready() { while [ "$#" -gt 0 ]; do case "$1" in - --seconds|-t) [ "$#" -ge 2 ] || usage; SECONDS="$2"; shift 2 ;; + --seconds|-t) [ "$#" -ge 2 ] || usage; DURATION_SEC="$2"; shift 2 ;; --devices) [ "$#" -ge 2 ] || usage; DEVICES="$2"; shift 2 ;; --exclude) [ "$#" -ge 2 ] || usage; EXCLUDE="$2"; shift 2 ;; --format) [ "$#" -ge 2 ] || usage; FORMAT="$2"; shift 2 ;; @@ -189,14 +190,51 @@ CHOSEN_FORMAT=$(choose_format) || { exit 1 } -echo "format=${CHOSEN_FORMAT}" +run_john_loop() { + opencl_id="$1" + deadline="$2" + round=0 + while :; do + now=$(date +%s) + remaining=$((deadline - now)) + if [ "${remaining}" -le 0 ]; then + break + fi + round=$((round + 1)) + slice="${remaining}" + if [ "${slice}" -gt "${TEST_SLICE_SECONDS}" ]; then + slice="${TEST_SLICE_SECONDS}" + fi + echo "device=${opencl_id} round=${round} remaining_sec=${remaining} slice_sec=${slice}" + ./john --test="${slice}" --format="${CHOSEN_FORMAT}" --devices="${opencl_id}" || return 1 + done +} + PIDS="" +cleanup() { + rc=$? + trap - EXIT INT TERM + for pid in ${PIDS}; do + kill "${pid}" 2>/dev/null || true + done + for pid in ${PIDS}; do + wait "${pid}" 2>/dev/null || true + done + exit "${rc}" +} +trap cleanup EXIT INT TERM + +echo "format=${CHOSEN_FORMAT}" +echo "target_seconds=${DURATION_SEC}" +echo "slice_seconds=${TEST_SLICE_SECONDS}" +DEADLINE=$(( $(date +%s) + DURATION_SEC )) _first=1 for opencl_id in $(echo "${JOHN_DEVICES}" | tr ',' ' '); do [ "${_first}" = "1" ] || sleep 3 _first=0 - ./john --test="${SECONDS}" --format="${CHOSEN_FORMAT}" --devices="${opencl_id}" & - PIDS="${PIDS} $!" + run_john_loop "${opencl_id}" "${DEADLINE}" & + pid=$! + PIDS="${PIDS} ${pid}" done FAIL=0 for pid in ${PIDS}; do