From 46a5c1a2606aa18f910a620cb49e99a20562653a Mon Sep 17 00:00:00 2001 From: msramalho <19508417+msramalho@users.noreply.github.com> Date: Fri, 7 Feb 2025 18:21:25 +0000 Subject: [PATCH] WAL checkpoint at startup --- src/core/events.py | 5 ++++- src/db/database.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/core/events.py b/src/core/events.py index d423b16..76dc973 100644 --- a/src/core/events.py +++ b/src/core/events.py @@ -6,9 +6,10 @@ from fastapi import FastAPI from contextlib import asynccontextmanager from fastapi_utils.tasks import repeat_every from loguru import logger +from sqlalchemy import text from db import crud, models, schemas -from db.database import get_db, get_db_async, make_engine +from db.database import get_db, get_db_async, make_engine, wal_checkpoint from shared.settings import get_settings from utils.metrics import measure_regular_metrics, redis_subscribe_worker_exceptions from worker.main import create_sheet_task @@ -41,6 +42,8 @@ async def lifespan(app: FastAPI): else: logger.warning("[CRON] Delete stale sheets cronjob is disabled.") + wal_checkpoint() + yield # separates startup from shutdown instructions # SHUTDOWN diff --git a/src/db/database.py b/src/db/database.py index 7e4046b..4555b61 100644 --- a/src/db/database.py +++ b/src/db/database.py @@ -1,5 +1,5 @@ from functools import lru_cache -from sqlalchemy import Engine, create_engine, event +from sqlalchemy import Engine, create_engine, event, text from sqlalchemy.orm import sessionmaker from shared.settings import get_settings from contextlib import asynccontextmanager, contextmanager @@ -36,11 +36,20 @@ def get_db_dependency(): with get_db() as db: yield db +def wal_checkpoint(): + # WAL checkpointing, make sure the .sqlite file receives the latest changes + # to be called at startup as it halts writes + with get_db() as db: + db.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")) # ASYNC connections async def make_async_engine(database_url: str) -> AsyncEngine: engine = create_async_engine(database_url, connect_args={"check_same_thread": False}) + + async with engine.begin() as conn: + await conn.run_sync(lambda sync_conn: sync_conn.execute("PRAGMA journal_mode=WAL;")) + return engine