refactor(doctor): share the holder pid renderer and mirror the guard's remedy
doctor_platform already rendered "PID N (cmd)" inline for the journal-mode holder report; the retired-WAL warning needs the same text, so the loop moves to hermes_state_holders.describe_holder_pid and both sites call it. The issue line now names the same writers the DeletedWalGenerationError message names (gateway, dashboard, cron) and repeats "do not delete the WAL yourself", so doctor and the guard tell one story. The test also spies _state_db_stats, the probe that printed the literal "0 process(es) holding the DB open" line the issue is about.
This commit is contained in:
@@ -54,6 +54,18 @@ def _read_proc_argv(pid: int) -> Optional[List[str]]:
|
||||
return None
|
||||
|
||||
|
||||
def describe_holder_pid(pid: int) -> str:
|
||||
"""``PID 123 (hermes gateway run)`` for operator-facing holder lists; /proc argv first, psutil elsewhere."""
|
||||
argv = _read_proc_argv(pid)
|
||||
if argv is None and psutil is not None:
|
||||
try:
|
||||
argv = psutil.Process(pid).cmdline() or None
|
||||
except Exception:
|
||||
argv = None
|
||||
who = " ".join(" ".join([os.path.basename(argv[0]), *argv[1:]]).split())[:80] if argv else "command line unavailable"
|
||||
return f"PID {pid} ({who})"
|
||||
|
||||
|
||||
def _looks_like_python_executable(program: str) -> bool:
|
||||
name = os.path.basename(program).lower().removesuffix(".exe")
|
||||
for prefix in ("python", "pypy"):
|
||||
|
||||
Reference in New Issue
Block a user