Skip to content

fix(mqtt): leva a correção da #56 para a develop (o #58 entrou numa branch já mergeada) - #71

Merged
hbgit merged 25 commits into
developfrom
fix/issue-56-integra-develop
Oct 15, 2026
Merged

hbgit merged 25 commits into
developfrom
fix/issue-56-integra-develop

Conversation

@hbgit

@hbgit hbgit commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Refs #56.

O PR #58 (correção da #56) foi mergeado em feat/issue-44-alertas-escalonar-tempo-real às 14:07 UTC de 2026-10-13, depois que o #57 já tinha levado essa branch para a develop (13:24 UTC). Os 24 commits da correção nunca chegaram à develop, embora a issue #56 esteja fechada: git cherry origin/develop origin/fix/issue-56-mqtt-queda-processo lista os 24 como +. Entre eles: zona por cliente no MqttAlertDispatcher, outbox que só marca publishedAt depois do PUBACK, runZonedGuarded global em bin/main.dart e restart: unless-stopped no Compose.

Este PR é um merge de origin/fix/issue-56-mqtt-queda-processo sobre a develop atual (106 commits à frente da base dd28239), preservando os SHAs originais.

Provas locais: dart analyze sem warnings nem erros (87 info); dart test -j 1 1355/1355, incluindo os 29 casos de mqtt_alert_dispatcher_resilience_test.dart; scripts/qa/mqtt_resiliencia_e2e_test.sh e scripts/qa/admin_alertas_escalonar_e2e_test.sh verdes. Não reexecutei o QA manual no Docker/TLS (scripts/qa/mqtt_resiliencia_e2e.sh); a evidência dele é a original, em docs/superpowers/plans/2026-10-12-issue-56-evidencias.md, medida sobre a base antiga.

Depois do merge, feat/issue-44-alertas-escalonar-tempo-real e fix/issue-56-mqtt-queda-processo ficam contidas na develop e podem ser removidas. Elas são as duas branches que sobraram da limpeza de 2026-10-15.

hbgit added 25 commits October 12, 2026 16:43
… e reconexão com backoff (#56)

O client.connect roda numa zona protegida a cada tentativa: o erro de E/S
que completa o Socket.done sem ouvinte (errno 32/104) deixa de chegar à
zona raiz e vira queda de conexão, com reconexão por backoff. Erro não
previsto registra só o tipo e chama onFatal (padrão exit(70)). Callback de
cliente obsoleto é ignorado. Teste com RST real (SO_LINGER 0) no broker
falso falhava antes e passa depois.
…ue não morre na troca (#56)

- Cada tentativa de conexão ganha uma zona própria, derivada da zona raiz,
  cujo handler conhece o cliente: erro tardio do socket antigo não derruba
  a conexão nova.
- Erro assíncrono depois de close() só é registrado (tipo), nunca chama
  onFatal.
- Uma queda na janela da troca de cliente, com o laço de reconexão ativo,
  zera _client e o laço tenta de novo, em vez de sair com cliente morto.
- Log injetável (padrão stderr); testes gravam onFatal e falham na hora
  quando um erro escapa da zona guardada.
…pós a reconexão (#56)

Dispatcher MQTT real contra o broker falso e o banco de teste: o alerta
criado com o broker fora fica no outbox, o dispatcher reconecta na mesma
porta e a varredura entrega uma vez só; o ACK continua funcionando.

Inclui dois testes que documentam a lacuna H5 no comportamento atual
(publicado no outbox sem PUBACK, sem retransmissão após a reconexão) e
a opção dropOnPublish do broker falso.
…agem se perde na queda

Registra o experimento da Tarefa 9 e a correção proposta (publish
confirmado por PUBACK, outbox marcando só depois), não aplicada por
mudar o contrato de AlertPublisher.
…o backend opcional (#56)

mqtt_resiliencia_e2e.sh passa a rodar contra o banco de teste: cria um
alerta vermelho pelo login OTP real do paciente da fixture durante a
interrupção do broker (B: stop/start; C: fora da rede, um alerta no começo
e outro no fim) e afirma, depois de restaurar, RestartCount 0 e StartedAt
inalterado, outbox publicado (só contagem) e entrega pelo broker a um
assinante QoS 1 de sessão persistente. A pausa do backend (A) fica atrás
de --com-pausa-do-backend, como diagnóstico.

admin_alertas_escalonar_e2e.sh também falha com RestartCount > 0.
…de os alertas (H5 no Docker/TLS)

Boot real com a zona global confirmado (saudável, health 200). Na
partição de rede o backend não percebe a queda (sem timeout de PINGRESP),
o outbox marca publicado e o broker nunca entrega: 4/4 alertas perdidos,
processo vivo e sem reinício. O escalonamento do admin com a regressão
offline segue verde no emulador.
… H5)

AlertPublisher.publish passa a Future<void>: completa no PUBACK do QoS 1 e
falha com MqttUnavailableException sem conexão, com queda antes da
confirmação ou no prazo (publishAckTimeout, padrão 10 s). No tempo limite o
dispatcher dá a conexão como perdida, reconecta e as publicações seguintes
falham na hora. O cliente passa a usar disconnectOnNoResponsePeriod = 10 s,
para detectar partição sem FIN/RST em até keepalive + 10 s.

Os dois testes H5 do ciclo de alerta foram invertidos e um terceiro cobre a
conexão morta sem PUBACK (cenário C); o broker falso ganhou withholdPuback.
…a a develop

O PR #58 foi mergeado em feat/issue-44-alertas-escalonar-tempo-real
depois que o #57 já tinha levado essa branch para a develop, e os 24
commits da correção nunca chegaram à develop, embora a issue #56 esteja
fechada.

Conflito único em backend/CLAUDE.md: mantém o parágrafo novo "MQTT do
backend e outbox (#56)" e a versão da develop do parágrafo de endpoints
(atualizada pela #46). spec/lgpd_data_audit.md: a linha citada de
lib/server.dart passa de 106 para 111, deslocada pelo laço de avisos
da #46.

Provas: dart analyze sem warnings; dart test -j 1 1355/1355 (inclui
os 29 casos de resiliencia); mqtt_resiliencia_e2e_test.sh e
admin_alertas_escalonar_e2e_test.sh verdes.
@hbgit
hbgit merged commit 7f85013 into develop Oct 15, 2026
10 checks passed
hbgit added a commit that referenced this pull request Oct 15, 2026
Diferenças em relação à previsão (três ci/* já removidas, lote 1 com 27),
resultado (36 removidas, 4 no remoto) e pendências (PR #71, auto-delete,
branches locais órfãs).
@hbgit
hbgit deleted the fix/issue-56-integra-develop branch October 15, 2026 22:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant