Harden reconciler status heartbeat startup

This commit is contained in:
xmrcheckout
2026-03-26 15:46:23 +00:00
parent ff96413d92
commit 10011ffb8c
+23 -3
View File
@@ -6,6 +6,7 @@ from datetime import datetime, timedelta, timezone
from decimal import Decimal, ROUND_DOWN from decimal import Decimal, ROUND_DOWN
from sqlalchemy import and_, or_ from sqlalchemy import and_, or_
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from .btcpay_webhooks import dispatch_btcpay_webhooks from .btcpay_webhooks import dispatch_btcpay_webhooks
@@ -31,14 +32,14 @@ def main() -> None:
status_db: Session | None = None status_db: Session | None = None
try: try:
status_db = SessionLocal() status_db = SessionLocal()
_update_reconciler_status( _safe_update_reconciler_status(
status_db, status_db,
started_at=datetime.now(timezone.utc), started_at=datetime.now(timezone.utc),
completed_at=None, completed_at=None,
error_message=None, error_message=None,
) )
_reconcile_invoices(service) _reconcile_invoices(service)
_update_reconciler_status( _safe_update_reconciler_status(
status_db, status_db,
completed_at=datetime.now(timezone.utc), completed_at=datetime.now(timezone.utc),
error_message=None, error_message=None,
@@ -47,7 +48,7 @@ def main() -> None:
logger.exception("Invoice reconcile failed: %s", exc) logger.exception("Invoice reconcile failed: %s", exc)
if status_db is None: if status_db is None:
status_db = SessionLocal() status_db = SessionLocal()
_update_reconciler_status( _safe_update_reconciler_status(
status_db, status_db,
error_message=str(exc), error_message=str(exc),
) )
@@ -293,6 +294,25 @@ def _update_reconciler_status(
db.commit() db.commit()
def _safe_update_reconciler_status(
db: Session,
*,
started_at: datetime | None = None,
completed_at: datetime | None = None,
error_message: str | None = None,
) -> None:
try:
_update_reconciler_status(
db,
started_at=started_at,
completed_at=completed_at,
error_message=error_message,
)
except SQLAlchemyError:
db.rollback()
logger.warning("Unable to persist reconciler status heartbeat", exc_info=True)
def _xmr_to_atomic(amount: Decimal) -> int: def _xmr_to_atomic(amount: Decimal) -> int: