From: Alison Schofield <alison.schofi...@intel.com>

monitor.sh runs for 50 seconds and spends 48 of those seconds sleeping
after sync. It sleeps for 3 seconds each time it restarts the monitor,
and 3 seconds before checking for expected log entries, a total of
16 naps.

Replace the sleeps with polling that waits for a max of 3 seconds but
does so in 30 0.1 second intervals. This leaves the current behavior
in place but offers a shorter run time for system configs capable of
a faster sync.

Again - I'd like to see some Tested-by's on this one because it wouldn't
be the first time my golden environment wasn't representative of all
environments where these tests are run. Thanks!

Signed-off-by: Alison Schofield <alison.schofi...@intel.com>
---

Changes in v2:
- Poll for 3 seconds instead of removing sleep entirely (MarcH)
- Update commit msg & log
Link to v1: 
https://lore.kernel.org/nvdimm/20250514014133.1431846-1-alison.schofi...@intel.com/

 test/monitor.sh | 43 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 40 insertions(+), 3 deletions(-)

diff --git a/test/monitor.sh b/test/monitor.sh
index be8e24d6f3aa..61cad098d87c 100755
--- a/test/monitor.sh
+++ b/test/monitor.sh
@@ -21,12 +21,45 @@ trap 'err $LINENO' ERR
 
 check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
 
+wait_for_logfile_update()
+{
+       local file="$1"
+       local prev_size="$2"
+       local timeout=30
+       local i=0
+
+       # prev_size is always zero because start_monitor truncates it.
+       # Set and check against it anyway to future proof.
+       while [ $i -lt $timeout ]; do
+               local new_size=$(stat -c%s "$file" 2>/dev/null || echo 0)
+               if [ "$new_size" -gt "$prev_size" ]; then
+                       return 0
+               fi
+               sleep 0.1
+               i=$((i+1))
+       done
+
+       echo "logfile not updated within 3 seconds"
+       err "$LINENO"
+}
+
 start_monitor()
 {
        logfile=$(mktemp)
        $NDCTL monitor -c "$monitor_conf" -l "$logfile" $1 &
        monitor_pid=$!
-       sync; sleep 3
+       sync
+       for i in {1..30}; do
+               if ps -p "$monitor_pid" > /dev/null; then
+                       sleep 0.1
+                       break
+               fi
+               sleep 0.1
+       done
+       if ! ps -p "$monitor_pid" > /dev/null; then
+               echo "monitor not ready within 3 seconds"
+               err "$LINENO"
+       fi
        truncate --size 0 "$logfile" #remove startup log
 }
 
@@ -48,14 +81,18 @@ get_monitor_dimm()
 
 call_notify()
 {
+       local prev_size=$(stat -c%s "$logfile")
        "$TEST_PATH"/smart-notify "$smart_supported_bus"
-       sync; sleep 3
+       sync
+       wait_for_logfile_update "$logfile" "$prev_size"
 }
 
 inject_smart()
 {
+       local prev_size=$(stat -c%s "$logfile")
        $NDCTL inject-smart "$monitor_dimms" $1
-       sync; sleep 3
+       sync
+       wait_for_logfile_update "$logfile" "$prev_size"
 }
 
 check_result()
-- 
2.37.3


Reply via email to