refactor: simplify mqtt pipeline state and remove event table
All checks were successful
Deploy to Production / deploy (push) Successful in 4m55s
All checks were successful
Deploy to Production / deploy (push) Successful in 4m55s
This commit is contained in:
@@ -2,45 +2,33 @@ from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import time
|
||||
from datetime import timedelta
|
||||
|
||||
from sqlmodel import Session
|
||||
|
||||
from app.core.config import settings
|
||||
from app.core.db import engine
|
||||
from app.models import TerminalMessageRaw, get_datetime_utc
|
||||
from app.models import TerminalMessageRaw
|
||||
from app.mqtt.parsers.mixed import parse_mixed_payload
|
||||
from app.mqtt.repository import (
|
||||
fetch_pending_rows_for_update,
|
||||
mark_failed,
|
||||
mark_processing,
|
||||
mark_succeeded,
|
||||
write_events_and_update_state,
|
||||
update_device_state_from_events,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _next_retry_delay_seconds(attempts: int) -> int:
|
||||
# Bounded exponential backoff: 30s, 60s, 120s, ... capped to 15m.
|
||||
return int(min(30 * (2 ** max(attempts - 1, 0)), 900))
|
||||
|
||||
|
||||
def _process_one_row(*, session: Session, row: TerminalMessageRaw) -> None:
|
||||
mark_processing(session=session, row=row)
|
||||
session.commit()
|
||||
|
||||
try:
|
||||
events = parse_mixed_payload(row.payload_bytes)
|
||||
write_events_and_update_state(session=session, row=row, events=events)
|
||||
update_device_state_from_events(session=session, row=row, events=events)
|
||||
mark_succeeded(session=session, row=row)
|
||||
except Exception as exc: # pragma: no cover - safety net path
|
||||
delay = _next_retry_delay_seconds(row.parse_attempts)
|
||||
mark_failed(
|
||||
session=session,
|
||||
row=row,
|
||||
parse_error=str(exc),
|
||||
next_retry_at=get_datetime_utc() + timedelta(seconds=delay),
|
||||
)
|
||||
|
||||
session.commit()
|
||||
|
||||
Reference in New Issue
Block a user