From 440ad6e8163508411b5de1fcfcf161cc6c64768d Mon Sep 17 00:00:00 2001 From: Andy Lee Date: Thu, 7 Aug 2025 23:03:28 -0700 Subject: [PATCH] fix: resolve CI hanging by removing problematic wait() in stop_server --- packages/leann-core/src/leann/api.py | 22 +++++++++++++++++++ .../src/leann/embedding_server_manager.py | 14 +++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/leann-core/src/leann/api.py b/packages/leann-core/src/leann/api.py index 356a5e6..daae62d 100644 --- a/packages/leann-core/src/leann/api.py +++ b/packages/leann-core/src/leann/api.py @@ -600,13 +600,26 @@ class LeannSearcher: ) except KeyError: RED = "\033[91m" + RESET = "\033[0m" logger.error( f" {RED}✗{RESET} [{i + 1:2d}] ID: '{string_id}' -> {RED}ERROR: Passage not found!{RESET}" ) + # Define color codes outside the loop for final message + GREEN = "\033[92m" + RESET = "\033[0m" logger.info(f" {GREEN}✓ Final enriched results: {len(enriched_results)} passages{RESET}") return enriched_results + def cleanup(self): + """Explicitly cleanup embedding server resources. + + This method should be called after you're done using the searcher, + especially in test environments or batch processing scenarios. + """ + if hasattr(self.backend_impl, "embedding_server_manager"): + self.backend_impl.embedding_server_manager.stop_server() + class LeannChat: def __init__( @@ -676,3 +689,12 @@ class LeannChat: except (KeyboardInterrupt, EOFError): print("\nGoodbye!") break + + def cleanup(self): + """Explicitly cleanup embedding server resources. + + This method should be called after you're done using the chat interface, + especially in test environments or batch processing scenarios. + """ + if hasattr(self.searcher, "cleanup"): + self.searcher.cleanup() diff --git a/packages/leann-core/src/leann/embedding_server_manager.py b/packages/leann-core/src/leann/embedding_server_manager.py index 445cbdd..9ded6e5 100644 --- a/packages/leann-core/src/leann/embedding_server_manager.py +++ b/packages/leann-core/src/leann/embedding_server_manager.py @@ -393,17 +393,9 @@ class EmbeddingServerManager: ) # Don't hang indefinitely - # Clean up process resources to prevent resource tracker warnings - try: - self.server_process.wait(timeout=1) # Give it one final chance with timeout - except subprocess.TimeoutExpired: - logger.warning( - f"Process {self.server_process.pid} still hanging after all kill attempts" - ) - # Don't wait indefinitely - just abandon it - except Exception: - pass - + # Clean up process resources without waiting + # The process should already be terminated/killed above + # Don't wait here as it can hang CI indefinitely self.server_process = None def _launch_server_process_colab(self, command: list, port: int) -> None: