mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-25 00:36:31 +02:00
feat: enhance memory management and session handling in database operations
- Introduced a shielded async session context manager to ensure safe session closure during cancellations. - Updated various database operations to utilize the new shielded session, preventing orphaned connections. - Added environment variables to optimize glibc memory management, improving overall application performance. - Implemented a function to trim the native heap, allowing for better memory reclamation on Linux systems.
This commit is contained in:
parent
dd3da2bc36
commit
ecb0a25cc8
7 changed files with 76 additions and 17 deletions
|
|
@ -1,7 +1,9 @@
|
|||
from collections.abc import AsyncGenerator
|
||||
from contextlib import asynccontextmanager
|
||||
from datetime import UTC, datetime
|
||||
from enum import StrEnum
|
||||
|
||||
import anyio
|
||||
from fastapi import Depends
|
||||
from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase
|
||||
from pgvector.sqlalchemy import Vector
|
||||
|
|
@ -1867,6 +1869,26 @@ engine = create_async_engine(
|
|||
async_session_maker = async_sessionmaker(engine, expire_on_commit=False)
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def shielded_async_session():
|
||||
"""Cancellation-safe async session context manager.
|
||||
|
||||
Starlette's BaseHTTPMiddleware cancels the task via an anyio cancel
|
||||
scope when a client disconnects. A plain ``async with async_session_maker()``
|
||||
has its ``__aexit__`` (which awaits ``session.close()``) cancelled by the
|
||||
scope, orphaning the underlying database connection.
|
||||
|
||||
This wrapper ensures ``session.close()`` always completes by running it
|
||||
inside ``anyio.CancelScope(shield=True)``.
|
||||
"""
|
||||
session = async_session_maker()
|
||||
try:
|
||||
yield session
|
||||
finally:
|
||||
with anyio.CancelScope(shield=True):
|
||||
await session.close()
|
||||
|
||||
|
||||
async def setup_indexes():
|
||||
async with engine.begin() as conn:
|
||||
# Create indexes
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue