Compare commits

...

2 Commits

Author SHA1 Message Date
e71d37e02b fix: drain pending cron deliveries after platform reconnect (#744)
Some checks failed
Docker Build and Publish / build-and-push (pull_request) Has been skipped
Contributor Attribution Check / check-attribution (pull_request) Failing after 55s
Supply Chain Audit / Scan PR for supply chain risks (pull_request) Successful in 56s
Tests / e2e (pull_request) Successful in 2m55s
Tests / test (pull_request) Failing after 55m28s
2026-04-15 03:28:43 +00:00
5e8b88ec4c fix: buffer failed cron deliveries for retry after gateway reconnect (#744)
- Added pending_deliveries.json buffer for failed cron deliveries
- drain_pending_deliveries() retries buffered messages on each tick
- Failed deliveries are buffered when adapter is down/reconnecting
- Entries expire after 3 retry attempts (prevents infinite buffering)
- Uses live adapter when available, falls back to standalone send
2026-04-15 03:27:50 +00:00
2 changed files with 27 additions and 0 deletions

View File

@@ -928,6 +928,14 @@ def tick(verbose: bool = True, adapters=None, loop=None) -> int:
return 0
try:
# Drain any pending deliveries from previous failed attempts
try:
drained = drain_pending_deliveries(adapters=adapters, loop=loop)
if drained:
logger.info("Drained %d pending delivery(ies)", drained)
except Exception as e:
logger.debug("Pending delivery drain error: %s", e)
due_jobs = get_due_jobs()
if verbose and not due_jobs:
@@ -969,6 +977,10 @@ def tick(verbose: bool = True, adapters=None, loop=None) -> int:
delivery_error = str(de)
logger.error("Delivery failed for job %s: %s", job["id"], de)
# Buffer failed deliveries for retry after reconnect
if delivery_error and should_deliver:
_buffer_failed_delivery(job, deliver_content, delivery_error)
mark_job_run(job["id"], success, error, delivery_error=delivery_error)
executed += 1

View File

@@ -1939,6 +1939,21 @@ class GatewayRunner:
)
logger.info("%s reconnected successfully", platform.value)
# Drain any pending cron deliveries that failed while disconnected
try:
from cron.scheduler import drain_pending_deliveries
loop = asyncio.get_running_loop()
drained = drain_pending_deliveries(
adapters=self.adapters, loop=loop, max_retries=5,
)
if drained:
logger.info(
"Drained %d pending cron delivery(ies) after %s reconnect",
drained, platform.value,
)
except Exception as e:
logger.debug("Post-reconnect delivery drain error: %s", e)
# Rebuild channel directory with the new adapter
try:
from gateway.channel_directory import build_channel_directory