diff --git a/blog/bp/blog/routes.py b/blog/bp/blog/routes.py index 2b788d9..570363e 100644 --- a/blog/bp/blog/routes.py +++ b/blog/bp/blog/routes.py @@ -48,10 +48,20 @@ def register(url_prefix, title): @blogs_bp.before_app_serving async def init(): from .ghost.ghost_sync import sync_all_content_from_ghost + from sqlalchemy import text + # Advisory lock prevents multiple Hypercorn workers from + # running the sync concurrently (which causes PK conflicts). async with get_session() as s: - await sync_all_content_from_ghost(s) - await s.commit() + got_lock = await s.scalar(text("SELECT pg_try_advisory_lock(900001)")) + if not got_lock: + return # another worker is syncing + try: + await sync_all_content_from_ghost(s) + await s.commit() + finally: + await s.execute(text("SELECT pg_advisory_unlock(900001)")) + await s.commit() @blogs_bp.before_request def route():