Skip to content

Commit 9858381

Browse files
committed
Implement network resilience
1 parent aab6bf1 commit 9858381

2 files changed

Lines changed: 30 additions & 5 deletions

File tree

m1wrapper/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
api_search_endpoint = 'batch-search'
55
api_results_endpoint = 'batch-search-result'
66
status_check_delay_s = 15
7+
http_backoff_factor = 5
8+
http_retries = 7
9+
http_retries_on_connect = 10

m1wrapper/search.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import requests
22
import json
33
import time
4+
import logging
45
from typing import List
56
from urllib.parse import urljoin
7+
from requests.adapters import HTTPAdapter
8+
from requests.packages.urllib3.util.retry import Retry
9+
requests.packages.urllib3.add_stderr_logger(logging.WARNING)
610

711
from .config import (
812
api_search_endpoint,
913
api_results_endpoint,
10-
status_check_delay_s
14+
status_check_delay_s,
15+
http_backoff_factor,
16+
http_retries,
17+
http_retries_on_connect
1118
)
1219

1320

@@ -41,6 +48,7 @@ def __init__(
4148
self.search_id = search_id
4249
self.base_url = base_url
4350
self.headers = headers
51+
self.http = self.__prepare_http()
4452
if self.search_id is None:
4553
new_search = self.__run(
4654
targets=targets,
@@ -59,9 +67,23 @@ def __prepare_payload(self, targets, parameters, starting_materials) -> dict:
5967

6068
return payload
6169

70+
def __prepare_http(self):
71+
retry_strategy = Retry(
72+
total=http_retries,
73+
connect=http_retries_on_connect,
74+
backoff_factor=http_backoff_factor,
75+
status_forcelist=[104, 111, 429, 500, 502, 503, 504],
76+
method_whitelist=["HEAD", "GET", "OPTIONS", "POST", "DELETE", "PUT"]
77+
)
78+
adapter = HTTPAdapter(max_retries=retry_strategy)
79+
http = requests.Session()
80+
http.mount("https://", adapter)
81+
http.mount("http://", adapter)
82+
return http
83+
6284
def __run(self, targets, parameters, starting_materials):
6385
payload = self.__prepare_payload(targets, parameters, starting_materials)
64-
response = requests.post(
86+
response = self.http.post(
6587
urljoin(self.base_url, api_search_endpoint),
6688
data=json.dumps(payload),
6789
headers=self.headers,
@@ -74,7 +96,7 @@ def from_id(cls, base_url, headers, search_id):
7496
return cls(base_url, headers, search_id)
7597

7698
def get_status(self):
77-
response = requests.get(
99+
response = self.http.get(
78100
urljoin(self.base_url, f'{api_search_endpoint}/{self.search_id}'),
79101
headers=self.headers,
80102
)
@@ -100,7 +122,7 @@ def get_partial_results(
100122
precision: int = None,
101123
only: List[str] = None
102124
):
103-
response = requests.get(
125+
response = self.http.get(
104126
urljoin(self.base_url, f'{api_results_endpoint}/{self.search_id}'),
105127
headers=self.headers,
106128
params={
@@ -112,7 +134,7 @@ def get_partial_results(
112134
return response.json()
113135

114136
def delete(self):
115-
response = requests.delete(
137+
response = self.http.delete(
116138
urljoin(self.base_url, f'{api_search_endpoint}/{self.search_id}'),
117139
headers=self.headers,
118140
)

0 commit comments

Comments
 (0)