16. Deferred work

Work that is knowingly incomplete, with enough of a pointer to pick it up.

This is not the issue tracker: anything a user has reported belongs at https://github.com/openpmix/prrte/issues. What is collected here is the other kind — a path the code takes deliberately today because the better one was left for later, a test that cannot exist yet, a measurement nobody has been able to take. Each entry says where the evidence is, so that the next person can decide whether it is still true before acting on it.

Add to it when you leave something undone, and delete from it when you do the work.

16.1. Runtime behavior

An elastic re-extend that reuses a previously-shrunk node was reported to hang. The sequence is: allocate one node, extend by three, shrink two, then extend by one reusing a node the shrink released. The first extend completes; the re-extend does not (#2491 closed the routing half of this, not this half). The mechanism identified at the time: a grow completes only through DAEMONS_REPORTEDVM_READY, which fires when daemons->num_procs == daemons->num_reported, and both counters are monotonic — neither is decremented when a daemon departs. A shrink therefore leaves them balanced, so the first extend is fine, while a re-extend raises the fence for a daemon that must report before the grow can complete. The dockerswarm suite covers grow → shrink → re-grow by hostname and passes; what has never been re-verified against current master is the same shape driven through ras/slurm, where the reuse code lives. A case belongs in contrib/slurmswarm/run-tests.sh either way — it is cheap, and its absence is why this is still an open question rather than a closed one.

``ras/flux`` has no ``modify()``. It returns PMIX_ERR_NOT_SUPPORTED (src/mca/ras/flux/ras_flux_module.c), so the elastic extend/release surface exists for SLURM only. Everything above the component is RM-agnostic; what is missing is the Flux-side conversation.

``PMIX_RANGE_CUSTOM`` denies everyone. The data server’s check_range has no accessor-list implementation and falls through to PMIX_ERROR (src/runtime/data_server/). Denying is the safe direction for an unimplemented rule, and it is the reason a publisher cannot express “these specific processes may read this”.

``filem/raw`` does not survive losing a daemon mid-staging. Its fault handler is deliberately minimal (src/mca/filem/raw/filem_raw_module.c); the note in place observes that the real thing should be straightforward, since the transport it stages over (xcast) is already resilient. Until then, a daemon lost while files are in flight fails the staging rather than re-driving it.

A promoted daemon’s failure notice does not carry its ancestor list. In src/rml/rml_fault_handler.c, a daemon whose parent changed reports the failures in its subtree upward, but not the ancestor chain it now believes in — so the new parent cannot confirm that the child agrees with it about the shape of the repaired tree.

Routing-tree state is not preserved across a DVM resize. prte_rml_compute_routing_tree re-initializes the failure bitmaps on every grow and restores only the permanent sets (dead_dmns, absent_dmns); whether anything else should survive the recompute is an open question marked in src/rml/routed_radix.c.

RELM has one module and no way to choose another. prte_relm_register registers the base implementation unconditionally (src/rml/relm/relm.c); the MCA variable that would select between modules does not exist. This is only worth doing if a second module does.

The post-fork child still calls into hwloc once. odls was converted to async-signal-safe operations between fork and exec except for hwloc_set_membind, which allocates internally; replacing it with a bare set_mempolicy/mbind means reproducing hwloc’s NUMA nodeset handling and was left for later (src/mca/odls/AGENTS.md).

16.2. Test coverage

Init and finalize. Nothing covers the prte_init/prte_finalize sequence itself beyond a smoke test, and nothing configures with --disable-per-user-config-files, so the #else arm of PRTE_WANT_HOME_CONFIG_FILES is never compiled in CI (src/runtime/AGENTS.md).

Heterogeneous DVMs. The byte-order helpers (prte_hton64 / prte_ntoh64) are exercised by every inter-daemon message, but the case they exist for — two daemons that disagree about endianness — cannot be built from a container swarm on one host. No test can currently fail if they are wrong.

The resource managers nobody has. ras/plm/ess components for PBS, LSF, gridengine, Flux and PALS are compile-only in CI (--enable-testbuild-launchers, and for the ones needing third-party headers, against declaration-only stubs). A build proves they still compile; only a real allocation on such a system proves anything else. SLURM is the exception — contrib/slurmswarm runs a real one.

macOS. contrib/dockerswarm/run-tests.sh macos is a single-host subset by construction. Everything multi-node on that platform is untested.

``SLURM_TASKS_PER_NODE`` in its single-node spelling. The suite asserts the 2(xN) form that a multi-node allocation produces; the 2(x1) form goes through the same parser and is not separately covered.

16.3. Performance work not landed

Lazy proc-data registration. prte_pmix_server_register_nspace publishes a PMIx proc-data entry for every proc in the job on every daemon — a table that grows with the whole job on a node running a fixed slice of it. An experimental branch registers only the procs a daemon hosts and derives the rest on demand in dmodex_req. It is written but unproven, and it is stacked on the xcast-shared-payload work rather than on a clean master, so it needs a rebase before it can even be measured. The rule it must keep to: switch on what PRRTE is the authority for (the placement and binding it decided, a closed set), never on what an application is expected to ask for.

Small effects cannot be measured end-to-end on the container swarm. At 40 nodes the collect fence’s wall clock has a run-to-run coefficient of variation of 35–50%, so anything under about a third is not resolvable there however many arms the sweep has — an attempt to settle whether compressing the xcast payload helps (an effect of 1–7%) produced overlapping ranges whose sign flipped between radices. Measure the mechanism directly instead (--prtemca grpcomm_base_verbose 1 reports the size, ratio and microseconds of every broadcast). See contrib/dockerswarm/AGENTS.md, §18.