gate: worker resilient to RLS errors during plugin activation, use crm_worker engine
This commit is contained in:
+8
-12
@@ -111,11 +111,13 @@ async def on_startup(ctx: dict[str, Any]) -> None:
|
|||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
|
|
||||||
registry = get_registry()
|
registry = get_registry()
|
||||||
registry.initialize(get_engine(), app=None)
|
from app.core.db import get_worker_engine
|
||||||
|
worker_engine = get_worker_engine()
|
||||||
|
registry.initialize(worker_engine, app=None)
|
||||||
registry.discover_builtins()
|
registry.discover_builtins()
|
||||||
|
|
||||||
event_bus = get_event_bus()
|
event_bus = get_event_bus()
|
||||||
async_session = async_sessionmaker(get_engine(), expire_on_commit=False)
|
async_session = async_sessionmaker(worker_engine, expire_on_commit=False)
|
||||||
|
|
||||||
# Activate plugins that are marked active in DB (register event handlers)
|
# Activate plugins that are marked active in DB (register event handlers)
|
||||||
# RLS fail-closed requires tenant context for tenant-table writes
|
# RLS fail-closed requires tenant context for tenant-table writes
|
||||||
@@ -146,17 +148,11 @@ async def on_startup(ctx: dict[str, Any]) -> None:
|
|||||||
await set_tenant_context(db, tenant_id)
|
await set_tenant_context(db, tenant_id)
|
||||||
await plugin.on_activate(db, container, event_bus)
|
await plugin.on_activate(db, container, event_bus)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error(f"Worker: failed to activate plugin {name} for tenant {tenant_id}: {exc}")
|
# RLS may block duplicate cron job inserts — rollback and continue
|
||||||
|
# The cron jobs are already registered from the API container startup
|
||||||
|
logger.warning(f"Worker: plugin {name} activation failed for tenant {tenant_id}: {exc}")
|
||||||
|
await db.rollback()
|
||||||
activation_failed = True
|
activation_failed = True
|
||||||
try:
|
|
||||||
from app.plugins.builtins.forgejo_error_reporter.service import report_error_to_forgejo
|
|
||||||
await report_error_to_forgejo({
|
|
||||||
"message": f"[Worker] Plugin activation failed: {name}: {exc}",
|
|
||||||
"stack": traceback.format_exc(),
|
|
||||||
"context": {"plugin": name, "source": "worker_startup"},
|
|
||||||
})
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
break
|
break
|
||||||
if not activation_failed:
|
if not activation_failed:
|
||||||
logger.info(f"Worker: activated plugin {name}")
|
logger.info(f"Worker: activated plugin {name}")
|
||||||
|
|||||||
Reference in New Issue
Block a user