gobridge

Runbook: Orchestrator Kill Before Shutdown Drain

Applies to: any deployment; both binaries. Audience: on-call operators. Risk: medium — the orchestrator SIGKILLed (or forced) the process before its graceful shutdown budget finished. Durable, at-least-once traffic survives and is redelivered; best-effort traffic in flight at the kill is lost.

Background

On SIGTERM/SIGINT GoBridge drains in phases: settle in-flight work (bounded by drain_timeout), release leases, close transports and stores, then stop HTTP — the whole sequence bounded by shutdown_timeout (deployment-guide.md). The orchestrator must give the container more stop time than shutdown_timeout, or it sends SIGKILL mid-drain. A second SIGINT/SIGTERM also forces an immediate exit before drain completes.

Symptom

Evidence the process was killed/forced before graceful drain finished:

Blast radius

Diagnosis / what to check after restart

  1. Outbox depthOutboxDepth should show the recovered backlog draining after restart; a persistent non-draining depth is a separate incident (outbox backlog / stuck drain).
  2. QoS 0 drop countersMQTTRouterStalePurged / MQTTRouterDropped around the kill window quantify best-effort loss (QoS 0 only; QoS 1/2 counted in MQTTRouterStalePurged is redelivered, not lost).
  3. MQTTAckAfterReconnect after restart — a burst predicts broker redelivery duplicates; verify downstream idempotency on direct_hold routes.

Remediation