From cf0bd5dd4c53685970d42deb4b606cf528b010ec Mon Sep 17 00:00:00 2001 From: Hao Zhe Date: Tue, 14 Jul 2026 12:58:22 +0800 Subject: [PATCH] fix(openviking): stop pending runtime start on shutdown --- plugins/memory/openviking/__init__.py | 5 ++- .../memory/test_openviking_shutdown.py | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/plugins/memory/openviking/__init__.py b/plugins/memory/openviking/__init__.py index 68f0f8f9eacb..5116e507b0bf 100644 --- a/plugins/memory/openviking/__init__.py +++ b/plugins/memory/openviking/__init__.py @@ -2201,7 +2201,8 @@ class OpenVikingMemoryProvider(MemoryProvider): should_start_waiter = False with self._runtime_start_lock: if ( - self._runtime_start_pending + self._shutting_down + or self._runtime_start_pending or (self._runtime_start_thread and self._runtime_start_thread.is_alive()) ): self._client = None @@ -2234,6 +2235,8 @@ class OpenVikingMemoryProvider(MemoryProvider): if should_start_waiter: with self._runtime_start_lock: self._runtime_start_pending = False + if self._shutting_down: + return self._start_runtime_openviking_waiter( status_callback=status_callback, warning_callback=warning_callback, diff --git a/tests/plugins/memory/test_openviking_shutdown.py b/tests/plugins/memory/test_openviking_shutdown.py index 650d444f948d..b7935875f31e 100644 --- a/tests/plugins/memory/test_openviking_shutdown.py +++ b/tests/plugins/memory/test_openviking_shutdown.py @@ -68,3 +68,43 @@ def test_shutdown_waits_for_runtime_start_thread(): assert finished.is_set() assert not t.is_alive() + + +def test_shutdown_during_pending_runtime_start_does_not_launch_waiter(monkeypatch): + """A waiter reserved before shutdown must not start after shutdown returns.""" + provider = OpenVikingMemoryProvider() + provider._endpoint = "http://127.0.0.1:1934" + status_entered = threading.Event() + release_status = threading.Event() + waiter_calls = [] + + monkeypatch.setattr( + openviking_module, + "_start_local_openviking_server", + lambda endpoint: (True, "started"), + ) + monkeypatch.setattr( + provider, + "_start_runtime_openviking_waiter", + lambda **kwargs: waiter_calls.append(kwargs), + ) + + def status_callback(_message): + status_entered.set() + assert release_status.wait(2.0) + + starter = threading.Thread( + target=provider._handle_runtime_openviking_unreachable, + kwargs={"status_callback": status_callback}, + name="openviking-pending-start", + ) + starter.start() + assert status_entered.wait(2.0) + + provider.shutdown() + release_status.set() + starter.join(timeout=2.0) + + assert not starter.is_alive() + assert provider._runtime_start_pending is False + assert waiter_calls == []