Skip to content

Commit d92c904

Browse files
Merge pull request pinecone-io#135 from pinecone-io/grpc_retries
Use built-in gRPC retry configuration
2 parents abbe52a + 1853970 commit d92c904

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

pinecone/core/grpc/index_grpc.py

+36-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from google.protobuf import json_format
1414
from grpc._channel import _InactiveRpcError, _MultiThreadedRendezvous
1515
from tqdm import tqdm
16+
import json
1617

1718
from pinecone import FetchResponse, QueryResponse, ScoredVector, SingleQueryResults, DescribeIndexStatsResponse
1819
from pinecone.config import Config
@@ -84,9 +85,38 @@ def __init__(self, index_name: str, channel=None, grpc_config: GRPCClientConfig
8485
"client-version": CLIENT_VERSION
8586
}
8687
self._endpoint_override = _endpoint_override
88+
89+
self.method_config = json.dumps(
90+
{
91+
"methodConfig": [
92+
{
93+
"name": [{"service": "VectorService.Upsert"}],
94+
"retryPolicy": {
95+
"maxAttempts": 5,
96+
"initialBackoff": "0.1s",
97+
"maxBackoff": "1s",
98+
"backoffMultiplier": 2,
99+
"retryableStatusCodes": ["UNAVAILABLE"],
100+
},
101+
},
102+
{
103+
"name": [{"service": "VectorService"}],
104+
"retryPolicy": {
105+
"maxAttempts": 5,
106+
"initialBackoff": "0.1s",
107+
"maxBackoff": "1s",
108+
"backoffMultiplier": 2,
109+
"retryableStatusCodes": ["UNAVAILABLE"],
110+
},
111+
}
112+
]
113+
}
114+
)
115+
87116
self._channel = channel or self._gen_channel()
88117
self.stub = self.stub_class(self._channel)
89118

119+
90120
@property
91121
@abstractmethod
92122
def stub_class(self):
@@ -100,7 +130,9 @@ def _gen_channel(self, options=None):
100130
target = self._endpoint()
101131
default_options = {
102132
"grpc.max_send_message_length": MAX_MSG_SIZE,
103-
"grpc.max_receive_message_length": MAX_MSG_SIZE
133+
"grpc.max_receive_message_length": MAX_MSG_SIZE,
134+
"grpc.service_config": self.method_config,
135+
"grpc.enable_retries": True
104136
}
105137
if self.grpc_client_config.secure:
106138
default_options['grpc.ssl_target_name_override'] = target.split(':')[0]
@@ -114,8 +146,8 @@ def _gen_channel(self, options=None):
114146
root_cas = open(certifi.where(), "rb").read()
115147
tls = grpc.ssl_channel_credentials(root_certificates=root_cas)
116148
channel = grpc.secure_channel(target, tls, options=_options)
117-
interceptor = RetryOnRpcErrorClientInterceptor(self.retry_config)
118-
return grpc.intercept_channel(channel, interceptor)
149+
150+
return channel
119151

120152
@property
121153
def channel(self):
@@ -246,7 +278,7 @@ def add_done_callback(self, fun):
246278

247279
def result(self, timeout=None):
248280
try:
249-
self._delegate.result(timeout=timeout)
281+
return self._delegate.result(timeout=timeout)
250282
except _MultiThreadedRendezvous as e:
251283
raise PineconeException(e._state.debug_error_string) from e
252284

0 commit comments

Comments
 (0)