Skip to content

v0.71.1

Choose a tag to compare

@adrianfiio adrianfiio released this 02 Aug 00:47

AFService Map v0.71.1 — Hotfix: laço de requisições

Backup/ponto de rollback: tag v0.71.0.

Hotfix urgente a partir de um report ao vivo em produção: ao abrir o
diálogo "Monitoramento SNMP" de um equipamento dentro de uma Torre, o
navegador entrou num laço de requisições — o DevTools mostrou cerca de
8900 chamadas em ~60 segundos pra /api/map/elements/<id>/container-layout-v3/,
todas falhando com net::ERR_INSUFFICIENT_RESOURCES (o navegador
esgotou o limite de conexões pendentes).

Causa

loadContainerLayout(), em static/js/map-optical-editor-v3.js, usa uma
variável de módulo (containerLayoutId) pra evitar buscar o layout do
mesmo elemento duas vezes. O problema: essa variável só é atualizada
depois que a requisição termina. Se a função for chamada de novo
antes da primeira resposta voltar, a segunda chamada ainda vê o valor
antigo, passa pela checagem, e dispara sua própria requisição — e assim
por diante enquanto o gatilho continuar disparando mais rápido que o
tempo de resposta da rede.

O gatilho, neste caso: static/js/map-link-monitoring.js (v0.71.0) reage
a mudanças no diálogo de Rack/Torre pra desenhar o botão "Monitoramento"
e colorir portas/equipamentos por status — e essas próprias mudanças no
DOM eram vistas pelo observador de mutação de OUTRO script
(map-optical-editor-v3.js), que então tentava recarregar o diagrama,
que por sua vez também mexia no DOM, retriggando o observador do
monitoramento — um laço de mutação alimentando os dois lados, rápido o
bastante pra estourar a checagem "já carregado" do jeito que ela estava
escrita.

Corrigido

  • loadContainerLayout() ganhou uma trava de "já em andamento",
    marcada antes do await (não depois), mais um intervalo mínimo de 1
    segundo entre buscas reais. Isso fecha a janela de corrida por completo
    — não importa quantas vezes a função for chamada nem o que estiver
    disparando isso, só uma requisição por vez consegue passar.
  • Título da porta parou de crescer indefinidamente: cada redecoração
    de status SNMP grudava mais um · SNMP UP em cima do título anterior
    em vez de substituir. Corrigido pra guardar o título original uma vez
    (dataset.monitorBaseTitle) e sempre remontar a partir dele.
  • Observador de mutação do monitoramento agora se desconecta antes de
    mexer no DOM
    (inserir botão, colorir portas/equipamentos) e só volta
    a observar depois — evita que ele reaja às próprias mudanças, cortando
    metade do laço na origem.

Atualização

Execute apply no servidor. Sem migration nesta versão — só dois
arquivos JavaScript. Depois do apply, um Ctrl+F5 no navegador
garante que a versão nova do JS seja carregada (evita cache do arquivo
antigo, que é justamente o que estava travando).

Teste sugerido: abrir uma Torre/Rack, entrar em Equipamentos, clicar
"Monitoramento" num equipamento, e conferir no DevTools (aba Network)
que não há mais uma enxurrada de requisições repetidas — só uma
chamada a container-layout-v3 ao abrir a estrutura.