Skip to content

Add longpoll provocation mode to the shutdown acceptance test#126

Merged
mgrossmann merged 2 commits into
mainfrom
issue-122-longpoll-provocation
Jul 23, 2026
Merged

Add longpoll provocation mode to the shutdown acceptance test#126
mgrossmann merged 2 commits into
mainfrom
issue-122-longpoll-provocation

Conversation

@mgrossmann

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #124 (merged): adds a PROVOKE=longpoll provocation mode to
tests/shutdown-acceptance.sh so the test actually exercises the parked-poll
shutdown path — the one that produces the SA03 tracked in #122.

Why

#124 added the abnormal-end assertions, but the default provocation cannot
reach that path
. PROVOKE=abend faults handlers (/abend), which drives
libc370's recovery-drain path — not a worker parked in a long poll. The SA03
(root cause mvsmf#179) requires a worker still in flight in a long poll when
P HTTPD lands; a fast fault never parks one, and the fault-marker gate would
return INCONCLUSIVE for a clean parked poll. So a green abend run does not
establish the mvsmf#179 fix.

Change

  • PROVOKE=longpoll: launch LONGPOLL_N (default 4) concurrent blocking
    long-polls (LONGPOLL_CMD, e.g. an unsol-detect-sync console PUT), verify ≥1
    is still parked LONGPOLL_SETTLE s later, then issue P HTTPD while they are
    in flight.
  • Proof-of-scenario for this mode is the in-flight count, not a fault marker
    (a cleanly parked poll faults nothing). The address-space-end assertions from
    Assert normal address-space termination in the shutdown acceptance test #124 are shared, unchanged.
  • Cleanup trap kills any surviving long-polls on exit.
  • README documents both modes + an example LONGPOLL_CMD.

Acceptance

mvsmf#179 acceptance must use PROVOKE=longpoll, not the default abend.

Verification

sh -n clean. Exercised across both modes with synthetic fixtures: abend
(SA03+fault-marker → FAIL, clean → PASS, no-marker → INCONCLUSIVE) and longpoll
(parked+clean → PASS, parked+SA03 → FAIL, not-parked → INCONCLUSIVE). No stray
processes left by the cleanup trap.

The 0x2C offset mvsMF uses to read the quiesce flag has a durable-accessor
follow-up: #125.

Refs #122

…down path

The shutdown acceptance test's default provocation faults handlers (/abend),
which drives libc370's recovery-drain path -- not a worker parked in a long
poll. The SA03 tracked in #122 (root cause mvsmf#179) needs a worker still in
flight in a long poll when P HTTPD lands, a state a fast fault cannot create.
A green default (abend) run therefore does not establish the mvsmf-side change.

Add PROVOKE=longpoll: launch LONGPOLL_N concurrent blocking long-polls
(LONGPOLL_CMD, e.g. an unsol-detect-sync console PUT), verify at least one is
still parked LONGPOLL_SETTLE seconds later, then issue P HTTPD while they are in
flight. Proof-of-scenario for this mode is the in-flight count, not a fault
marker (a cleanly parked poll faults nothing); the address-space-end assertions
are unchanged and shared between both modes. A cleanup trap kills any surviving
long-polls on exit.

Refs #122
The example LONGPOLL_CMD pointed at .../consoles/defcn/solmsgs, which is the
GET collect sub-resource, not the command-issue endpoint. The endpoint that
drives the unsol_sync poll loop is PUT /zosmf/restconsoles/consoles/{console-
name} (mvsmf.c add_route). A /solmsgs PUT would not match that route, so no
worker parks and the run reports INCONCLUSIVE rather than reproducing the
scenario. Drop the suffix; JSON keys verified against consoleIssueHandler.

Also document that the in-flight count is measured at settle time: in manual
stop mode the operator's reaction gap can exceed the poll timeout, so
unsol-detect-timeout must be set comfortably high (example raised to 60 s).

Refs #122
@mgrossmann
mgrossmann merged commit 780d608 into main Jul 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant