Skip to content

relay: imagen de 2026-08-25 — el semáforo de handlers se llenó y por WebSocket no salió ningún mensaje durante 24 h #11

Open

Description

@A-PachecoT

Context

Del 2026-10-16 ~11:56 al 2026-10-17 12:17 (Lima) nadie pudo enviar desde Buzz Desktop ni desde el móvil: el envío daba "error de conexión" al minuto. Leer sí funcionaba (va por POST /query del bridge HTTP), y los envíos por HTTP (buzz CLI) también.

Causa medida: el relay corre ghcr.io/block/buzz:sha-52621c0 (2026-08-25, la de Desktop 0.5.20) según deploy/railway/Dockerfile en railway-deploy. Los clientes están en Desktop 0.5.28. Upstream va 451 commits adelante (95 en crates/buzz-relay/buzz-pubsub).

En esa versión, crates/buzz-relay/src/connection.rs:571 toma un permiso de handler_semaphore (global, en memoria, BUZZ_MAX_CONCURRENT_HANDLERS default 1024) por cada EVENT/REQ/COUNT y lo suelta solo cuando el handler termina. handlers/req.rs no tiene deadline. Con los 1024 permisos tomados, todo EVENT por WebSocket recibe NOTICE "rate-limited: too many concurrent requests" y nunca un OK; el cliente espera el OK y corta a los 60 s. El relay no loguea ese rechazo, así que los logs se veían limpios.

Upstream lo cerró en block#7854 (2026-09-28, 9b1c4f98e): "a 188-reply thread never finishes" → statement_timeout de 20 s en las lecturas aux, timeout terminal para REQ/COUNT y lifecycle de suscripciones bajo un solo lock (los refcounts de topics; tenemos ~58 warns/min de release_topic called for unretained topic). <> que la consulta colgada fuera exactamente esa: no hay acceso a las métricas internas (puerto 9102).

Mitigación aplicada 2026-10-17 12:17: deploymentRestart del relay (vacía el semáforo). Sin el update, se vuelve a llenar.

Proposed fix

  1. Backup de postgres-volume y minio-volume antes de tocar nada (volumeInstanceBackupCreate; IDs en handbook/infrastructure/railway.md §buzz). Verificar el backup con volumeInstanceBackupList, no con el booleano de la mutación.
  2. En cofoundy/buzz@railway-deploy, cambiar ARG BUZZ_IMAGE=ghcr.io/block/buzz:sha-52621c0 a un sha-<commit> de upstream main que sea ≥ 9b1c4f98e y cuyo tag exista en ghcr (<> cuál es el último tag publicado). Nunca :latest.
  3. Leer antes las 28 migraciones de crates/buzz-db entre 52621c0..<sha> y los cambios de config (NIP-FI shadow mode df3f28a2c, mesh JWKS 2d0f78c6e, operator listeners ebe99a46e que hace fallar el arranque con config inválida) y decidir qué env vars hacen falta.
  4. PR a railway-deploy; el deploy a prod lo aprueba André.

Acceptance criteria

  • Backups de volumen de postgres y minio con fecha del día, verificados por listado.
  • El relay corre una imagen sha-* ≥ 9b1c4f98e (verificado contra la API de Railway, no contra el Dockerfile).
  • La sonda por WebSocket (abajo) devuelve OK true en < 2 s.
  • Desktop 0.5.28 y móvil envían y reciben en un canal y en un DM.
  • Huddle, git (buzz repos) y media (subir una imagen) siguen funcionando.
  • handbook/infrastructure/SYSTEMS.md §Buzz y buzz/BITACORA.md dicen la imagen nueva y la fecha.

Verification method — OBSERVED

Sonda: abrir wss://buzz.cofoundy.dev, responder el AUTH de NIP-42 con la llave -cc y mandar un kind 9 con ["h","32fd4fb9-3ab1-447c-b000-aafc4a8e7934"] (#pilot-agentes). Script: un websockets + coincurve de ~40 líneas (handshake, sign_schnorr).

Antes del restart (2026-10-17 11:47, Mac de André):

[  0.8s] <- ["AUTH","4f76e9c4…"]
[  1.0s] <- ["OK","a389b497…",true,""]
[  1.0s] -> EVENT 3929b47354340677
[  1.2s] <- ["NOTICE","rate-limited: too many concurrent requests"]
[ 71.2s] SIN OK del relay en 70s

Después del restart (12:18):

[  0.9s] -> EVENT 62a2af58101d2c44
[  1.1s] <- ["OK","62a2af58…",true,""]

Después del update se espera lo segundo.

Guardrails

  • No borrar ni recrear volúmenes (el 2026-08-04 eso dejó 42 h de caída).
  • No usar :latest. No usar railway up (el servicio tiene source de GitHub).
  • No mergear ni desplegar sin el OK de André: es prod y las migraciones no tienen vuelta atrás salvo restaurar el backup.
  • No tocar BUZZ_MAX_CONCURRENT_HANDLERS como "fix": subirlo solo tarda más en llenarse.

Scope + references

Una sola cosa: actualizar la imagen del relay. El monitoreo va en un issue aparte.

Activity

  1. added
    bugSomething isn't working
    founder-inputDecision only Andre can make
    agent-readyIssue con los 6 campos del issue-standard: un agente puede tomarlo y auto-verificar
    on Oct 17, 2026
  2. A-PachecoT commented on Oct 17, 2026

    @A-PachecoT
    MemberAuthor

    Upgrade aplicado 2026-10-17 12:26 (Lima) — cofoundy/buzz@railway-deploy 26644ae89, relay + pair-relay a sha-c1370cc (release de Desktop 0.5.28, incluye block#7854).

    Medido:

    • Backups pre-update-relay-sha-c1370cc-2026-10-17: postgres 1185 MB referenciados, minio 4412 MB (volumeInstanceBackupList).
    • Build FROM ghcr.io/block/buzz:sha-c1370cc@sha256:ee69a0c0…; relay da0da932 y pair-relay c8ffc85d en SUCCESS; log Database migrations complete.
    • Sonda WebSocket: ["OK","0c1f85bd…",true,""] en 0,2 s.
    • Pair-relay: handshake WS 101 (--http1.1).
    • Datos: 24 canales visibles para andre-cc (igual que antes), historial presente, búsqueda FTS ok.
    • SSOT: handbook/infrastructure/buzz/BITACORA.md + bitacora/2026-10-17-semaforo-lleno-y-upgrade-relay.md.

    Falta para cerrar: envío desde el móvil, un huddle, buzz repos (git) y subir una imagen.

    Claude-Session: https://claude.ai/code/session_016JodCnaz4KuGt43YubLgVc

  3. A-PachecoT commented on Oct 17, 2026

    @A-PachecoT
    MemberAuthor

    Reportado por André 2026-10-17 12:35 (no medido por mí): envío desde el móvil, subir imagen y git funcionan con sha-c1370cc.

    Lo único que falta para cerrar es probar un huddle: dos personas en llamada al menos 1 minuto, con audio en ambas direcciones.

    Claude-Session: https://claude.ai/code/session_016JodCnaz4KuGt43YubLgVc

  4. A-PachecoT commented on Oct 17, 2026

    @A-PachecoT
    MemberAuthor

    Corrección al comentario anterior: André no probó git. Lo que reportó: envío desde el móvil y subir una imagen.

    Git, medido por mí:

    • Arranque de sha-c1370cc: git object-store backend admitted: A3 conformance probe passed (17:27:24 UTC). El backend de MinIO acepta escribir y leer objetos git.
    • buzz repos list → []. No hay ningún repo anunciado en el relay, así que no hay un flujo de git que pueda romperse. Tampoco está git-credential-nostr en el Mac (CI no shippea git-credential-nostr → git push contra el relay es imposible en una caja limpia #1). Lo dejo así; un push y clone de prueba no protege nada que se use.

    Para cerrar solo falta probar un huddle.

    Claude-Session: https://claude.ai/code/session_016JodCnaz4KuGt43YubLgVc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyIssue con los 6 campos del issue-standard: un agente puede tomarlo y auto-verificarbugSomething isn't workingfounder-inputDecision only Andre can make

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions