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.

Add a wait_for_logfile_update() helper that waits a max of 3 seconds
for an expected string to appear N times in the logfile using tail -F.

Add a "monitor ready" log message to the monitor executable and wait
for that message once after monitor start. Note that if no DIMM has an
event flag set, there will be no log entry at startup. Always look for
the "monitor ready" message.

Expand the check_result() function to handle both the sync and wait
that were previously duplicated in inject_smart() and call_notify().
It now waits for the expected N of new log entries.

Again, looking for Tested-by Tags. Thanks!

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

Changes in v3:
- Add and use a helper that uses tail -F
- Add ready message to monitor.c
- Update commit msg and log
Link to v2: 
https://lore.kernel.org/nvdimm/20250516044628.1532939-1-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/


 ndctl/monitor.c |  2 +-
 test/monitor.sh | 24 +++++++++++++++++++++---
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/ndctl/monitor.c b/ndctl/monitor.c
index bd8a74863476..925b37f4184b 100644
--- a/ndctl/monitor.c
+++ b/ndctl/monitor.c
@@ -658,7 +658,7 @@ int cmd_monitor(int argc, const char **argv, struct 
ndctl_ctx *ctx)
                        rc = -ENXIO;
                goto out;
        }
-
+       info(&monitor, "monitor ready\n");
        rc = monitor_event(ctx, &mfa);
 out:
        if (monitor.ctx.log_file)
diff --git a/test/monitor.sh b/test/monitor.sh
index be8e24d6f3aa..d0666392ab5b 100755
--- a/test/monitor.sh
+++ b/test/monitor.sh
@@ -21,12 +21,28 @@ trap 'err $LINENO' ERR
 
 check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
 
+wait_for_logfile_update()
+{
+       local expect_string="$1"
+       local expect_count="$2"
+
+       # Wait up to 3s for $expect_count occurrences of $expect_string
+       # tail -n +1 -F: starts watching the logfile from the first line
+
+       if ! timeout 3s tail -n +1 -F "$logfile" | grep -m "$expect_count" -q 
"$expect_string"; then
+               echo "logfile not updated in 3 secs"
+               err "$LINENO"
+       fi
+}
+
 start_monitor()
 {
        logfile=$(mktemp)
        $NDCTL monitor -c "$monitor_conf" -l "$logfile" $1 &
        monitor_pid=$!
-       sync; sleep 3
+
+       sync
+       wait_for_logfile_update "monitor ready" 1
        truncate --size 0 "$logfile" #remove startup log
 }
 
@@ -49,17 +65,19 @@ get_monitor_dimm()
 call_notify()
 {
        "$TEST_PATH"/smart-notify "$smart_supported_bus"
-       sync; sleep 3
 }
 
 inject_smart()
 {
        $NDCTL inject-smart "$monitor_dimms" $1
-       sync; sleep 3
 }
 
 check_result()
 {
+       sync
+       expect_count=$(wc -w <<< "$1")
+       wait_for_logfile_update "timestamp" "$expect_count"
+
        jlog=$(cat "$logfile")
        notify_dimms=$(jq ."dimm"."dev" <<<"$jlog" | sort | uniq | xargs)
        [[ "$1" == "$notify_dimms" ]]
-- 
2.37.3


Reply via email to