Skip to content

Commit 3b7890d

Browse files
committed
a fastapi depency is cached and thus the same connection is given per request
1 parent ab497a2 commit 3b7890d

File tree

3 files changed

+106
-60
lines changed
  • services
    • api-server/src/simcore_service_api_server/api/dependencies
    • catalog/src/simcore_service_catalog/api/dependencies
    • director-v2/src/simcore_service_director_v2/api/dependencies

3 files changed

+106
-60
lines changed
Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,56 @@
1+
import logging
12
from typing import AsyncGenerator, Callable, Type
23

3-
from aiopg.sa import Engine
4+
from aiopg.sa import Engine, SAConnection
45
from fastapi import Depends
56
from fastapi.requests import Request
67

78
from ...db.repositories import BaseRepository
89

10+
logger = logging.getLogger(__name__)
11+
912

1013
def _get_db_engine(request: Request) -> Engine:
1114
return request.app.state.engine
1215

1316

17+
async def _acquire_connection(engine: Engine = Depends(_get_db_engine)) -> SAConnection:
18+
logger.debug(
19+
"Acquiring pg connection from pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
20+
engine.size,
21+
engine.size - engine.freesize,
22+
engine.freesize,
23+
engine.minsize,
24+
engine.maxsize,
25+
)
26+
if engine.freesize <= 1:
27+
logger.warning(
28+
"Last or no pg connection in pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
29+
engine.size,
30+
engine.size - engine.freesize,
31+
engine.freesize,
32+
engine.minsize,
33+
engine.maxsize,
34+
)
35+
36+
async with engine.acquire() as conn:
37+
yield conn
38+
39+
logger.debug(
40+
"Released pg connection: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
41+
engine.size,
42+
engine.size - engine.freesize,
43+
engine.freesize,
44+
engine.minsize,
45+
engine.maxsize,
46+
)
47+
48+
1449
def get_repository(repo_type: Type[BaseRepository]) -> Callable:
1550
async def _get_repo(
16-
engine: Engine = Depends(_get_db_engine),
51+
db_connection: SAConnection = Depends(_acquire_connection),
1752
) -> AsyncGenerator[BaseRepository, None]:
18-
async with engine.acquire() as conn:
19-
yield repo_type(conn)
53+
54+
yield repo_type(db_connection)
2055

2156
return _get_repo
Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from typing import AsyncGenerator, Callable, Type
33

4-
from aiopg.sa import Engine
4+
from aiopg.sa import Engine, SAConnection
55
from fastapi import Depends
66
from fastapi.requests import Request
77

@@ -14,36 +14,43 @@ def _get_db_engine(request: Request) -> Engine:
1414
return request.app.state.engine
1515

1616

17-
def get_repository(repo_type: Type[BaseRepository]) -> Callable:
18-
async def _get_repo(
19-
engine: Engine = Depends(_get_db_engine),
20-
) -> AsyncGenerator[BaseRepository, None]:
21-
22-
logger.debug(
23-
"Acquiring pg connection from pool: current=%d, free=%d, reserved=[%d, %d]",
24-
engine.size,
25-
engine.freesize,
26-
engine.minsize,
27-
engine.maxsize,
28-
)
29-
if engine.freesize <= 1:
30-
logger.warning(
31-
"Last or no pg connection in pool: current=%d, free=%d, reserved=[%d, %d]",
32-
engine.size,
33-
engine.freesize,
34-
engine.minsize,
35-
engine.maxsize,
36-
)
37-
38-
async with engine.acquire() as conn:
39-
yield repo_type(conn)
40-
41-
logger.debug(
42-
"Released pg connection: current=%d, free=%d, reserved=[%d, %d]",
17+
async def _acquire_connection(engine: Engine = Depends(_get_db_engine)) -> SAConnection:
18+
logger.debug(
19+
"Acquiring pg connection from pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
20+
engine.size,
21+
engine.size - engine.freesize,
22+
engine.freesize,
23+
engine.minsize,
24+
engine.maxsize,
25+
)
26+
if engine.freesize <= 1:
27+
logger.warning(
28+
"Last or no pg connection in pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
4329
engine.size,
30+
engine.size - engine.freesize,
4431
engine.freesize,
4532
engine.minsize,
4633
engine.maxsize,
4734
)
4835

36+
async with engine.acquire() as conn:
37+
yield conn
38+
39+
logger.debug(
40+
"Released pg connection: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
41+
engine.size,
42+
engine.size - engine.freesize,
43+
engine.freesize,
44+
engine.minsize,
45+
engine.maxsize,
46+
)
47+
48+
49+
def get_repository(repo_type: Type[BaseRepository]) -> Callable:
50+
async def _get_repo(
51+
db_connection: SAConnection = Depends(_acquire_connection),
52+
) -> AsyncGenerator[BaseRepository, None]:
53+
54+
yield repo_type(db_connection)
55+
4956
return _get_repo
Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from typing import AsyncGenerator, Callable, Type
33

4-
from aiopg.sa import Engine
4+
from aiopg.sa import Engine, SAConnection
55
from fastapi import Depends
66
from fastapi.requests import Request
77

@@ -14,39 +14,43 @@ def _get_db_engine(request: Request) -> Engine:
1414
return request.app.state.engine
1515

1616

17-
def get_repository(repo_type: Type[BaseRepository]) -> Callable:
18-
async def _get_repo(
19-
engine: Engine = Depends(_get_db_engine),
20-
) -> AsyncGenerator[BaseRepository, None]:
21-
22-
logger.debug(
23-
"Acquiring pg connection from pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
24-
engine.size,
25-
engine.size - engine.freesize,
26-
engine.freesize,
27-
engine.minsize,
28-
engine.maxsize,
29-
)
30-
if engine.freesize <= 1:
31-
logger.warning(
32-
"Last or no pg connection in pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
33-
engine.size,
34-
engine.size - engine.freesize,
35-
engine.freesize,
36-
engine.minsize,
37-
engine.maxsize,
38-
)
39-
40-
async with engine.acquire() as conn:
41-
yield repo_type(conn)
42-
43-
logger.debug(
44-
"Released pg connection: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
17+
async def _acquire_connection(engine: Engine = Depends(_get_db_engine)) -> SAConnection:
18+
logger.debug(
19+
"Acquiring pg connection from pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
20+
engine.size,
21+
engine.size - engine.freesize,
22+
engine.freesize,
23+
engine.minsize,
24+
engine.maxsize,
25+
)
26+
if engine.freesize <= 1:
27+
logger.warning(
28+
"Last or no pg connection in pool: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
4529
engine.size,
4630
engine.size - engine.freesize,
4731
engine.freesize,
4832
engine.minsize,
4933
engine.maxsize,
5034
)
5135

36+
async with engine.acquire() as conn:
37+
yield conn
38+
39+
logger.debug(
40+
"Released pg connection: pool size=%d, acquired=%d, free=%d, reserved=[%d, %d]",
41+
engine.size,
42+
engine.size - engine.freesize,
43+
engine.freesize,
44+
engine.minsize,
45+
engine.maxsize,
46+
)
47+
48+
49+
def get_repository(repo_type: Type[BaseRepository]) -> Callable:
50+
async def _get_repo(
51+
db_connection: SAConnection = Depends(_acquire_connection),
52+
) -> AsyncGenerator[BaseRepository, None]:
53+
54+
yield repo_type(db_connection)
55+
5256
return _get_repo

0 commit comments

Comments
 (0)