Skip to content

Commit ec818c9

Browse files
committed
fixed connection to db
1 parent 25ca3d7 commit ec818c9

File tree

3 files changed

+63
-16
lines changed

3 files changed

+63
-16
lines changed

packages/service-library/src/servicelib/db_async_engine.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import contextlib
12
import logging
23
import warnings
4+
from collections.abc import AsyncIterator
35

46
from fastapi import FastAPI
57
from settings_library.postgres import PostgresSettings
68
from simcore_postgres_database.utils_aiosqlalchemy import ( # type: ignore[import-not-found] # this on is unclear
79
get_pg_engine_stateinfo,
810
raise_if_migration_not_ready,
911
)
10-
from sqlalchemy.ext.asyncio import create_async_engine
12+
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
1113
from tenacity import retry
1214

1315
from .logging_utils import log_context
@@ -16,6 +18,37 @@
1618
_logger = logging.getLogger(__name__)
1719

1820

21+
@contextlib.asynccontextmanager
22+
async def with_async_pg_engine(
23+
settings: PostgresSettings,
24+
) -> AsyncIterator[AsyncEngine]:
25+
"""
26+
Creates an asyncpg engine and ensures it is properly closed after use.
27+
"""
28+
try:
29+
with log_context(
30+
_logger,
31+
logging.DEBUG,
32+
f"connection to db {settings.dsn_with_async_sqlalchemy}",
33+
):
34+
server_settings = None
35+
if settings.POSTGRES_CLIENT_NAME:
36+
assert isinstance(settings.POSTGRES_CLIENT_NAME, str)
37+
38+
engine = create_async_engine(
39+
settings.dsn_with_async_sqlalchemy,
40+
pool_size=settings.POSTGRES_MINSIZE,
41+
max_overflow=settings.POSTGRES_MAXSIZE - settings.POSTGRES_MINSIZE,
42+
connect_args={"server_settings": server_settings},
43+
pool_pre_ping=True, # https://docs.sqlalchemy.org/en/14/core/pooling.html#dealing-with-disconnects
44+
future=True, # this uses sqlalchemy 2.0 API, shall be removed when sqlalchemy 2.0 is released
45+
)
46+
yield engine
47+
finally:
48+
with log_context(_logger, logging.DEBUG, f"db disconnect of {engine}"):
49+
await engine.dispose()
50+
51+
1952
@retry(**PostgresRetryPolicyUponInitialization(_logger).kwargs)
2053
async def connect_to_db(app: FastAPI, settings: PostgresSettings) -> None:
2154
warnings.warn(

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/external_dependencies.py

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
from common_library.errors_classes import OsparcErrorMixin
22
from fastapi import FastAPI
3-
from servicelib.db_async_engine import connect_to_db
43
from servicelib.utils import logged_gather
5-
from settings_library.postgres import PostgresSettings
64

7-
from ..modules.service_liveness import wait_for_service_liveness
5+
from ..modules.database import wait_for_database_liveness
86
from .rabbitmq import wait_for_rabbitmq_liveness
97
from .registry import wait_for_registries_liveness
10-
from .settings import ApplicationSettings
118
from .storage import wait_for_storage_liveness
129

1310

@@ -24,19 +21,9 @@ def setup_check_dependencies(app: FastAPI) -> None:
2421
# start rapidly, for this reason they are run in
2522
# parallel.
2623
async def on_startup() -> None:
27-
app_settings = app.state.settings
28-
assert isinstance(app_settings, ApplicationSettings) # nosec
29-
postgres_settings = app_settings.POSTGRES_SETTINGS
30-
assert isinstance(postgres_settings, PostgresSettings) # nosec
3124
liveliness_results = await logged_gather(
3225
*[
33-
wait_for_service_liveness(
34-
connect_to_db,
35-
app,
36-
postgres_settings,
37-
service_name="Postgres",
38-
endpoint=postgres_settings.dsn,
39-
),
26+
wait_for_database_liveness(app),
4027
wait_for_rabbitmq_liveness(app),
4128
wait_for_registries_liveness(app),
4229
wait_for_storage_liveness(app),
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from fastapi import FastAPI
2+
from servicelib.db_async_engine import with_async_pg_engine
3+
from servicelib.db_asyncpg_utils import check_postgres_liveness
4+
from settings_library.postgres import PostgresSettings
5+
6+
from ..core.settings import ApplicationSettings
7+
from .service_liveness import (
8+
wait_for_service_liveness,
9+
)
10+
11+
12+
async def wait_for_database_liveness(app: FastAPI) -> None:
13+
"""
14+
Checks if the postgres engine is alive and can be used.
15+
"""
16+
17+
app_settings = app.state.settings
18+
assert isinstance(app_settings, ApplicationSettings) # nosec
19+
postgres_settings = app_settings.POSTGRES_SETTINGS
20+
assert isinstance(postgres_settings, PostgresSettings) # nosec
21+
async with with_async_pg_engine(postgres_settings) as engine:
22+
await wait_for_service_liveness(
23+
check_postgres_liveness,
24+
engine,
25+
service_name="Postgres",
26+
endpoint=postgres_settings.dsn,
27+
)

0 commit comments

Comments
 (0)