From f3d0dbe5a8e367eade313a853431dd3c886da646 Mon Sep 17 00:00:00 2001 From: Sy03 <1370724210@qq.com> Date: Mon, 5 Oct 2026 22:07:14 +0800 Subject: [PATCH] [Bugfix] Preserve host transport fallback when discovery cleanup fails Signed-off-by: Sy03 <1370724210@qq.com> --- .../distributed/omni_connectors/test_shm_ring.py | 16 ++++++++++++++++ .../omni_connectors/connectors/shm_ring.py | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/tests/distributed/omni_connectors/test_shm_ring.py b/tests/distributed/omni_connectors/test_shm_ring.py index fccbd38c7..3693b0c70 100644 --- a/tests/distributed/omni_connectors/test_shm_ring.py +++ b/tests/distributed/omni_connectors/test_shm_ring.py @@ -9,6 +9,7 @@ import time import uuid from dataclasses import asdict from multiprocessing import shared_memory +from pathlib import Path import msgspec import numpy as np @@ -446,6 +447,21 @@ def test_ring_setup_failure_keeps_connector_usable(edge, monkeypatch): assert receiver.get("0", "1", "no-ring-space")[0].tolist() == [0, 1, 2] +def test_discovery_stamp_failure_keeps_fallback_and_cleanup_usable(edge, monkeypatch): + sender, receiver = edge + + def stamp_denied(*args, **kwargs): + raise PermissionError("directory timestamp update denied") + + monkeypatch.setattr(os, "utime", stamp_denied) + ok, _, metadata = sender.put("0", "1", "no-ring-stamp", torch.arange(3)) + assert ok and "shm" in metadata + assert not sender._host_ring.producers + assert not list(Path(f"/dev/shm/{sender._host_ring.directory}").iterdir()) + assert receiver.get("0", "1", "no-ring-stamp")[0].tolist() == [0, 1, 2] + sender.close() + + def test_close_is_idempotent_and_removes_owned_ring(edge): sender, receiver = edge _, _, metadata = sender.put("0", "1", "close", torch.arange(3)) diff --git a/vllm_omni/distributed/omni_connectors/connectors/shm_ring.py b/vllm_omni/distributed/omni_connectors/connectors/shm_ring.py index f3376e217..0bce1b10d 100644 --- a/vllm_omni/distributed/omni_connectors/connectors/shm_ring.py +++ b/vllm_omni/distributed/omni_connectors/connectors/shm_ring.py @@ -233,6 +233,10 @@ class _Channel: os.unlink(os.path.basename(self.registry), dir_fd=directory_fd) except FileNotFoundError: pass + except OSError as error: + # The allocation is already retired. A failed discovery stamp + # must not mask setup failure or prevent the per-key fallback. + logger.debug("Failed to retire host ring marker %s: %s", self.registry, error) class HostRingTransport: @@ -423,6 +427,8 @@ class HostRingTransport: os.unlink(name, dir_fd=directory_fd) except FileNotFoundError: pass + except OSError as error: + logger.debug("Failed to prune host ring marker %s: %s", path, error) continue except (BlockingIOError, ValueError): # Attachment may race a writer holding the frame lock.