Skip to content

Commit 39a93b3

Browse files
committed
tests: Add retry logic for all HTTP requests in server tests
This is an attempt to handle race conditions between /health returning OK and the other endpoints not returning successfully. #13979 (comment) Branch: HybridRecurrentCache Signed-off-by: Gabe Goodhart <[email protected]>
1 parent 60ca3ba commit 39a93b3

File tree

1 file changed

+50
-18
lines changed

1 file changed

+50
-18
lines changed

tools/server/tests/utils.py

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828

2929
DEFAULT_HTTP_TIMEOUT = 12
30+
DEFAULT_RETRY_SLEEP = 0.1
3031

3132
if "LLAMA_SANITIZE" in os.environ or "GITHUB_ACTION" in os.environ:
3233
DEFAULT_HTTP_TIMEOUT = 30
@@ -256,25 +257,56 @@ def make_request(
256257
data: dict | Any | None = None,
257258
headers: dict | None = None,
258259
timeout: float | None = None,
260+
retry_timeout: float = DEFAULT_HTTP_TIMEOUT,
261+
retry_sleep: float = DEFAULT_RETRY_SLEEP,
262+
exp_ok: bool = True,
259263
) -> ServerResponse:
260-
url = f"http://{self.server_host}:{self.server_port}{path}"
261-
parse_body = False
262-
if method == "GET":
263-
response = requests.get(url, headers=headers, timeout=timeout)
264-
parse_body = True
265-
elif method == "POST":
266-
response = requests.post(url, headers=headers, json=data, timeout=timeout)
267-
parse_body = True
268-
elif method == "OPTIONS":
269-
response = requests.options(url, headers=headers, timeout=timeout)
270-
else:
271-
raise ValueError(f"Unimplemented method: {method}")
272-
result = ServerResponse()
273-
result.headers = dict(response.headers)
274-
result.status_code = response.status_code
275-
result.body = response.json() if parse_body else None
276-
print("Response from server", json.dumps(result.body, indent=2))
277-
return result
264+
start_time = time.time()
265+
retry = False
266+
try:
267+
url = f"http://{self.server_host}:{self.server_port}{path}"
268+
parse_body = False
269+
if method == "GET":
270+
response = requests.get(url, headers=headers, timeout=timeout)
271+
parse_body = True
272+
elif method == "POST":
273+
response = requests.post(url, headers=headers, json=data, timeout=timeout)
274+
parse_body = True
275+
elif method == "OPTIONS":
276+
response = requests.options(url, headers=headers, timeout=timeout)
277+
else:
278+
raise ValueError(f"Unimplemented method: {method}")
279+
request_dt = time.time() - start_time
280+
result = ServerResponse()
281+
result.headers = dict(response.headers)
282+
result.status_code = response.status_code
283+
if (
284+
exp_ok and
285+
(response.status_code < 200 or response.status_code >= 300) and
286+
retry_timeout > request_dt
287+
):
288+
retry = True
289+
else:
290+
result.body = response.json() if parse_body else None
291+
print("Response from server", json.dumps(result.body, indent=2))
292+
return result
293+
except Exception:
294+
request_dt = time.time() - start_time
295+
if retry_timeout > request_dt:
296+
retry = True
297+
else:
298+
raise
299+
if retry:
300+
time.sleep(retry_sleep)
301+
return self.make_request(
302+
method=method,
303+
path=path,
304+
data=data,
305+
headers=headers,
306+
timeout=timeout,
307+
retry_timeout=retry_timeout - request_dt - retry_sleep,
308+
)
309+
278310

279311
def make_stream_request(
280312
self,

0 commit comments

Comments
 (0)