Skip to content

Commit f09b9c2

Browse files
authored
🎨Director-v0: set default timeout to 20s and potentially allow setting it up (#7460)
1 parent 3a4bf81 commit f09b9c2

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

packages/service-library/src/servicelib/fastapi/client_session.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
import datetime
2+
13
import httpx
24
from fastapi import FastAPI
35

46

5-
def setup_client_session(app: FastAPI, *, max_keepalive_connections: int = 20) -> None:
7+
def setup_client_session(
8+
app: FastAPI,
9+
*,
10+
default_timeout: datetime.timedelta = datetime.timedelta(seconds=20),
11+
max_keepalive_connections: int = 20
12+
) -> None:
613
async def on_startup() -> None:
714
session = httpx.AsyncClient(
815
transport=httpx.AsyncHTTPTransport(http2=True),
916
limits=httpx.Limits(max_keepalive_connections=max_keepalive_connections),
17+
timeout=default_timeout.total_seconds(),
1018
)
1119
app.state.aiohttp_client_session = session
1220

services/director/src/simcore_service_director/core/application.py

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI:
5656
setup_client_session(
5757
app,
5858
max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS,
59+
default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT,
5960
)
6061
setup_registry(app)
6162

services/director/src/simcore_service_director/core/settings.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,21 @@ class ApplicationSettings(BaseApplicationSettings, MixinLoggingSettings):
112112
),
113113
)
114114

115-
DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS: NonNegativeInt = 0
115+
DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS: NonNegativeInt = 5
116+
DIRECTOR_REGISTRY_CLIENT_TIMEOUT: datetime.timedelta = datetime.timedelta(
117+
seconds=20
118+
)
116119
DIRECTOR_REGISTRY_CLIENT_MAX_CONCURRENT_CALLS: PositiveInt = 20
117120
DIRECTOR_REGISTRY_CLIENT_MAX_NUMBER_OF_RETRIEVED_OBJECTS: PositiveInt = 30
118121

122+
@field_validator("DIRECTOR_REGISTRY_CLIENT_TIMEOUT")
123+
@classmethod
124+
def _check_positive(cls, value: datetime.timedelta) -> datetime.timedelta:
125+
if value.total_seconds() < 0:
126+
msg = "DIRECTOR_REGISTRY_CLIENT_TIMEOUT must be positive"
127+
raise ValueError(msg)
128+
return value
129+
119130
@field_validator("DIRECTOR_GENERIC_RESOURCE_PLACEMENT_CONSTRAINTS_SUBSTITUTIONS")
120131
@classmethod
121132
def _validate_substitutions(cls, v):

services/director/tests/unit/test_core_settings.py

+13
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
# pylint: disable=too-many-arguments
55

66

7+
import datetime
8+
79
import pytest
10+
from pydantic import ValidationError
811
from pytest_simcore.helpers.monkeypatch_envs import (
912
setenvs_from_dict,
1013
setenvs_from_envfile,
@@ -37,6 +40,16 @@ def test_valid_web_application_settings(app_environment: EnvVarsDict):
3740
)
3841

3942

43+
def test_invalid_client_timeout_raises(
44+
app_environment: EnvVarsDict, monkeypatch: pytest.MonkeyPatch
45+
):
46+
monkeypatch.setenv(
47+
"DIRECTOR_REGISTRY_CLIENT_TIMEOUT", f"{datetime.timedelta(seconds=-10)}"
48+
)
49+
with pytest.raises(ValidationError):
50+
ApplicationSettings.create_from_envs()
51+
52+
4053
def test_docker_container_env_sample(monkeypatch: pytest.MonkeyPatch):
4154
monkeypatch.delenv("DIRECTOR_DEFAULT_MAX_MEMORY", raising=False)
4255

0 commit comments

Comments
 (0)