Skip to content

Commit 1567ec7

Browse files
authored
Merge pull request #164 from SCAI-BIO/refactor/robust-weaviate-embedded-startup
refactor: add retries to weaviate connection
2 parents 4e3d8ca + 570102c commit 1567ec7

1 file changed

Lines changed: 23 additions & 7 deletions

File tree

datastew/repository/weaviate.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import json
22
import logging
33
import socket
4+
import time
45
from typing import Any, Dict, List, Literal, Optional, Sequence, Union
56

67
import weaviate
78
from typing_extensions import deprecated
89
from weaviate import WeaviateClient
910
from weaviate.classes.query import Filter, MetadataQuery, QueryReference
1011
from weaviate.collections import Collection
12+
from weaviate.exceptions import WeaviateStartUpError
1113
from weaviate.util import generate_uuid5
1214

1315
from datastew.embedding import Vectorizer
@@ -772,19 +774,33 @@ def _is_port_in_use(port) -> bool:
772774
return s.connect_ex(("localhost", port)) == 0
773775

774776
def _connect_to_memory(self, path: str, http_port: int, grpc_port: int) -> WeaviateClient:
775-
try:
776-
if path is None:
777-
raise ValueError("Path must be provided for disk mode.")
778-
if self._is_port_in_use(http_port) and self._is_port_in_use(grpc_port):
777+
if path is None:
778+
raise ValueError("Path must be provided for disk mode.")
779+
780+
# If there's already a Weaviate instance listening; just connect to it.
781+
if self._is_port_in_use(http_port) and self._is_port_in_use(grpc_port):
782+
try:
779783
return weaviate.connect_to_local(port=http_port, grpc_port=grpc_port, headers=self.headers)
780-
else:
784+
except Exception as e:
785+
raise ConnectionError(f"Failed to initialize Weaviate client (embedded): {e}") from e
786+
787+
last_exc: Exception | None = None
788+
for _ in range(3):
789+
try:
781790
return weaviate.connect_to_embedded(
782791
persistence_data_path=path,
783792
headers=self.headers,
784793
environment_variables={"ENABLE_MODULES": "text2vec-ollama"},
785794
)
786-
except Exception as e:
787-
raise ConnectionError(f"Failed to initialize Weaviate client: {e}")
795+
except WeaviateStartUpError as e:
796+
last_exc = e
797+
time.sleep(2.0)
798+
except Exception as e:
799+
raise ConnectionError(f"Failed to initialize Weaviate client (embedded): {e}") from e
800+
801+
raise ConnectionError(
802+
f"Failed to initalize Weaviate client (embedded) after retries: {last_exc}"
803+
) from last_exc
788804

789805
def _connect_to_remote(self, path: str, port: int) -> WeaviateClient:
790806
try:

0 commit comments

Comments
 (0)