From b6efe3a72659b9f50327b232daf7c84da272753e Mon Sep 17 00:00:00 2001 From: Andy Lee Date: Wed, 13 Aug 2025 22:52:54 -0700 Subject: [PATCH] zmq: set SNDTIMEO=1s and LINGER=0 for REP sockets to avoid send blocking during shutdown; reduces CI hang risk --- .../leann_backend_diskann/diskann_embedding_server.py | 8 +++++--- .../leann_backend_hnsw/hnsw_embedding_server.py | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/leann-backend-diskann/leann_backend_diskann/diskann_embedding_server.py b/packages/leann-backend-diskann/leann_backend_diskann/diskann_embedding_server.py index 1d5896b..2b1e326 100644 --- a/packages/leann-backend-diskann/leann_backend_diskann/diskann_embedding_server.py +++ b/packages/leann-backend-diskann/leann_backend_diskann/diskann_embedding_server.py @@ -103,8 +103,9 @@ def create_diskann_embedding_server( socket.bind(f"tcp://*:{zmq_port}") logger.info(f"DiskANN ZMQ REP server listening on port {zmq_port}") - socket.setsockopt(zmq.RCVTIMEO, 300000) - socket.setsockopt(zmq.SNDTIMEO, 300000) + socket.setsockopt(zmq.RCVTIMEO, 1000) + socket.setsockopt(zmq.SNDTIMEO, 1000) + socket.setsockopt(zmq.LINGER, 0) while True: try: @@ -236,7 +237,8 @@ def create_diskann_embedding_server( # Set receive timeout so we can check shutdown_event periodically rep_socket.setsockopt(zmq.RCVTIMEO, 1000) # 1 second timeout - rep_socket.setsockopt(zmq.SNDTIMEO, 300000) + rep_socket.setsockopt(zmq.SNDTIMEO, 1000) + rep_socket.setsockopt(zmq.LINGER, 0) try: while not shutdown_event.is_set(): diff --git a/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_embedding_server.py b/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_embedding_server.py index 6690c51..85c279a 100644 --- a/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_embedding_server.py +++ b/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_embedding_server.py @@ -108,7 +108,9 @@ def create_hnsw_embedding_server( rep_socket.bind(f"tcp://*:{zmq_port}") logger.info(f"HNSW ZMQ REP server listening on port {zmq_port}") rep_socket.setsockopt(zmq.RCVTIMEO, 1000) - rep_socket.setsockopt(zmq.SNDTIMEO, 300000) + # Keep sends from blocking during shutdown; fail fast and drop on close + rep_socket.setsockopt(zmq.SNDTIMEO, 1000) + rep_socket.setsockopt(zmq.LINGER, 0) # Track last request type/length for shape-correct fallbacks last_request_type = "unknown" # 'text' | 'distance' | 'embedding' | 'unknown'