Skip to content

ESPResSo/Open MPI does not survive migration: epoll/eventfd-based progress engine not virtualized by the wormhole #14

Description

@KrisBuytaert

Summary

After the fixes in #10, #11 and #13, GROMACS round-trips migration 100% reliably (test-eessi-gromacs.sh, 14/14 passes across repeated runs, both expel and migrate ... home return paths). ESPResSo built against Open MPI still does not survive migration end-to-end, but for a different and narrower reason than any of the above three bugs.

Symptom

Post-migration, an ESPResSo/MPI process's threads intermittently fail wormhole-proxied syscalls with errors that don't correspond to any real local condition:

  • epoll_wait: Bad address
  • eventfd: Bad file descriptor (also seen from a background monitor loop polling the process, e.g. [warn] Error reading from eventfd: Bad file descriptor)

Separately, a non-leader thread has been observed issuing repeated statx RPCs at high frequency without ever terminating that loop.

No crash, no oops, no coredump — the process just stops making forward progress on its MPI progress loop.

Root cause (hypothesis, not yet fixed)

Open MPI's progress engine uses epoll/eventfd internally to wait on multiple readiness sources efficiently. The wormhole's existing proxy model (kretprobe hook → freeze calling thread → RPC to home node → single reply → resume) works for simple request/reply syscalls (open/read/write/lseek/fsync/statx) where a Ghost file's state is naturally recreated from a single round-trip.

epoll/eventfd are structurally different: they're stateful, long-lived kernel objects that track readiness over time across a set of registered fds, expected to be efficiently poll-able many times without a fresh round-trip each time. A generic single-shot request/reply proxy has no natural way to reconstruct that in-kernel readiness-tracking state after migration — there's no "one RPC" that captures "is any of these N fds ready right now, and wake me when one becomes ready."

What we ruled out

This is not the same bug as #7, #10, #11, or #13 — GROMACS (no epoll/eventfd dependency) is now 100% reliable with those fixes in place; this reproduces specifically and only with MPI's epoll-based progress engine.

Possible directions (not attempted)

  1. A real remote-epoll proxy: forward epoll_ctl/epoll_wait registrations to the home node and maintain live readiness state there, pushing wake events back — nontrivial, but the "correct" fix.
  2. Explicitly scope MPI/epoll-heavy workloads out of migration support for now (document the limitation) rather than attempt a partial fix.
  3. Some MPI-transport-level workaround (e.g. forcing a different Open MPI progress/transport mode that doesn't rely on epoll) — untested, may just move the problem.

Happy to help test any direction you'd want to take here — didn't want to guess at a fix without your input on which of the above (if any) fits where you want this project to go.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions