2026-07-29 power outage: RabbitMQ mnesia corruption took down all consumers (recovered) #895

Open
opened 2026-07-29 13:40:28 +00:00 by spikerj · 0 comments
Owner

What happened

Power outage ~07:30-13:00Z (whole swarm). All 10 nodes rejoined cleanly, but every RabbitMQ consumer crash-looped afterward (spikersoft-backend exit 139, EventHandler hosts exiting on StartAndTuneAsync failure).

Root cause

The broker's mnesia DB on GlusterFS (/mnt/rabbitmq/mnesia, ds4) was corrupted by the power loss: broker booted and accepted TCP/AMQP handshakes, but its user table was empty (rabbitmqctl list_users → 0 rows, only ~1 queue left) and internal state was broken (add_userError: noproc). Every service got PLAIN login refused: user 'dockerUser' - invalid credentials. Because the node wasn't "fresh", the entrypoint never re-created the default user from RABBITMQ_DEFAULT_USER/PASS.

Note: overlay DNS + gluster mount were healthy — this was NOT a repeat of #885's DNS record loss, despite identical consumer symptoms.

Remediation (done 13:32-13:35Z)

  1. docker service scale rabbitmq_rabbitmq=0
  2. On ds4: mv /mnt/rabbitmq/mnesia /mnt/rabbitmq/mnesia.corrupt-20260729 (backup kept, can delete after a few days)
  3. Scale back to 1 → fresh boot created dockerUser, consumers reconnected (49 successful auths in first 2 min, 0 refused).
  4. Force-updated 12 services stuck in Complete (won't self-reschedule): gpu-coordinator, docker-monitor, upload-coordinator, gameserver, metadata-extractor, security-monitor, security-scanner, system-remediation, decompile, artpipe-photostack, clamav, node-agent.
  5. book-management + influx-dashboard were Rejected: No such image (digest) — re-resolved digests via service update --image :latest --force.

Verified: learn.spikersoft.com 200, api.spikersoft.com/healthz 200, backend 1/1, all mongo/redis/keycloak/minio/bao stacks 1/1 (bao unsealed).

Lost with the broker DB

Queued-but-unprocessed messages from before the outage (delayed-exchange messages included). If anything looks unprocessed (notifications, media jobs), that's why.

Follow-ups

  • artpipe-model-blender still Reject-looping on missing image — pre-existing #887, unchanged.
  • Delete /mnt/rabbitmq/mnesia.corrupt-20260729 after a week.
  • Consider rabbitmqctl export_definitions cron → gluster, so a corrupt DB restore doesn't rely on env defaults (topology/users would reimport).
  • Alerting still blind (#756) — nobody was paged for this either.
## What happened Power outage ~07:30-13:00Z (whole swarm). All 10 nodes rejoined cleanly, but **every RabbitMQ consumer crash-looped** afterward (`spikersoft-backend` exit 139, EventHandler hosts exiting on `StartAndTuneAsync` failure). ## Root cause The broker's mnesia DB on GlusterFS (`/mnt/rabbitmq/mnesia`, ds4) was **corrupted by the power loss**: broker booted and accepted TCP/AMQP handshakes, but its user table was empty (`rabbitmqctl list_users` → 0 rows, only ~1 queue left) and internal state was broken (`add_user` → `Error: noproc`). Every service got `PLAIN login refused: user 'dockerUser' - invalid credentials`. Because the node wasn't "fresh", the entrypoint never re-created the default user from `RABBITMQ_DEFAULT_USER/PASS`. Note: overlay DNS + gluster mount were healthy — this was NOT a repeat of #885's DNS record loss, despite identical consumer symptoms. ## Remediation (done 13:32-13:35Z) 1. `docker service scale rabbitmq_rabbitmq=0` 2. On ds4: `mv /mnt/rabbitmq/mnesia /mnt/rabbitmq/mnesia.corrupt-20260729` (backup kept, can delete after a few days) 3. Scale back to 1 → fresh boot created `dockerUser`, consumers reconnected (49 successful auths in first 2 min, 0 refused). 4. Force-updated 12 services stuck in `Complete` (won't self-reschedule): gpu-coordinator, docker-monitor, upload-coordinator, gameserver, metadata-extractor, security-monitor, security-scanner, system-remediation, decompile, artpipe-photostack, clamav, node-agent. 5. book-management + influx-dashboard were `Rejected: No such image (digest)` — re-resolved digests via `service update --image :latest --force`. Verified: learn.spikersoft.com 200, api.spikersoft.com/healthz 200, backend 1/1, all mongo/redis/keycloak/minio/bao stacks 1/1 (bao unsealed). ## Lost with the broker DB Queued-but-unprocessed messages from before the outage (delayed-exchange messages included). If anything looks unprocessed (notifications, media jobs), that's why. ## Follow-ups - [ ] `artpipe-model-blender` still Reject-looping on missing image — pre-existing #887, unchanged. - [ ] Delete `/mnt/rabbitmq/mnesia.corrupt-20260729` after a week. - [ ] Consider `rabbitmqctl export_definitions` cron → gluster, so a corrupt DB restore doesn't rely on env defaults (topology/users would reimport). - [ ] Alerting still blind (#756) — nobody was paged for this either.
Sign in to join this conversation.