☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta produção. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta produção. Mostrar todas as mensagens

sexta-feira, 28 de agosto de 2026

Westworld no CICS — Quando o Cowboy de Chapéu Preto Atravessou a Região, Igor Tentou Dar RETURN e Descobriu que o ABEND Ainda Tinha Balas

 

Bellacosa Mainframe e o westworld no CICS 

☕ Um Café no Bellacosa Mainframe

Westworld no CICS — Quando o Cowboy de Chapéu Preto Atravessou a Região, Igor Tentou Dar RETURN e Descobriu que o ABEND Ainda Tinha Balas

Ou: um jovem padawan COBOL entrou no parque de diversões do CICS, confundiu condição excepcional com fim do mundo, encontrou ASRA no saloon, AICA galopando em círculos e aprendeu que capturar o Pistoleiro não significa recuperar a transação


Prólogo — “Temos as férias perfeitas para você”

Em 1973, muito antes de alguém discutir inteligência artificial generativa no café da firma, Michael Crichton escreveu e dirigiu Westworld. O filme mostrava Delos, um parque de diversões para adultos formado por três mundos: o Velho Oeste, a Roma Antiga e a Europa medieval. Os visitantes pagavam para viver fantasias cercados por androides tão convincentes que pareciam humanos.

Tudo funcionava até deixar de funcionar.

Pequenas anomalias surgiam aqui e ali. Um robô recusava uma ordem. Uma cascavel mecânica atacava quando não deveria. Um cavaleiro ultrapassava os limites de segurança. Os técnicos percebiam que alguma coisa estava errada, mas ainda acreditavam que o problema cabia dentro dos painéis da sala de controle.

Então aparece o Pistoleiro, interpretado por Yul Brynner: roupa preta, passos metódicos, olhos artificiais e uma persistência que faria qualquer operador pedir um CEMT INQUIRE TASK. Aquilo que fora criado para perder duelos e divertir visitantes passa a perseguir Peter Martin como se tivesse recebido uma instrução impossível de cancelar.

O filme é uma metáfora quase perfeita para uma região CICS.

Delos é a região. Cada visitante é uma task. Os edifícios são recursos. Os anfitriões são programas. A sala subterrânea representa as equipes de operação. As regras do parque são as definições e controles do CICS. E o Cowboy de Chapéu Preto é o ABEND: ele pode surgir num programa profundo, atravessar níveis lógicos e continuar subindo até encontrar alguém preparado para recebê-lo.

Mas há uma diferença importante: no CICS, não basta atirar no mensageiro, apagar a mensagem da tela e dizer que o parque voltou ao normal. É preciso descobrir o que aconteceu com a unidade de trabalho, o que foi atualizado, o que precisa ser desfeito e se a transação ainda é confiável.

Bem-vindo a Westworld. Favor manter mãos, pés e COMMAREA dentro da transação.




1. Antes do tiroteio: transação, task e programa não são a mesma coisa

Para o programador COBOL iniciante, esses três conceitos às vezes parecem sinônimos. Não são.

A transação é identificada normalmente por um código de quatro caracteres, como TR01. Sua definição informa ao CICS qual programa inicial deve ser executado e contém atributos operacionais importantes.

A task é a instância daquela transação em execução. Se cinquenta usuários executarem TR01, teremos uma mesma definição de transação, mas várias tasks, cada qual com seu número, seu contexto e seus dados.

O programa é o código que executa dentro da task. Uma task pode passar por muitos programas:

TR01
  └── PROGA
        └── LINK PROGB
              └── LINK PROGC

Pense em Delos. “Westworld” é a atração anunciada no catálogo. A visita de Peter Martin é uma execução concreta. O saloon, a cadeia e o hotel são partes diferentes da experiência. Do mesmo modo, a transação é a entrada comercial; a task é a visita em andamento; e os programas são os ambientes atravessados.

Quando ocorre um ABEND, é a task que termina anormalmente. O programa que estava ativo pode ter provocado a falha, recebido a falha ou simplesmente estar no caminho dela.

Essa distinção muda o diagnóstico. Dizer “o programa caiu” é confortável, mas incompleto. O suporte precisa saber:

  • qual região CICS;

  • qual transação;

  • qual número da task;

  • qual programa estava executando;

  • qual nível lógico;

  • qual comando ou instrução falhou;

  • qual unidade de trabalho estava aberta;

  • quais recursos haviam sido alterados.

O código do ABEND é a placa pendurada no saloon. A cena do crime continua lá dentro.



2. Afinal, o que é um ABEND?

ABEND significa abnormal end, ou término anormal. Ele ocorre quando a task não pode — ou não deve — continuar seu processamento normal.

As causas incluem:

  • program check;

  • erro de lógica;

  • dado incompatível;

  • endereço de memória inválido;

  • condição excepcional CICS não tratada;

  • loop ou consumo excessivo de CPU;

  • arquivo fechado ou indisponível;

  • programa inexistente ou desabilitado;

  • falha de autorização;

  • timeout ou purge;

  • erro em comunicação;

  • EXEC CICS ABEND emitido deliberadamente pela aplicação;

  • problema de integridade em uma unidade de trabalho.

O iniciante costuma imaginar que todo ABEND é equivalente a uma explosão. Alguns são explosões. Outros são portas que a aplicação tentou abrir sem possuir a chave. Outros ainda são o próprio programa puxando o alarme porque percebeu que continuar seria perigoso.

Por isso, “eliminar todos os ABENDs” não é uma meta madura. Uma aplicação financeira pode preferir terminar anormalmente e executar backout a continuar depois de uma atualização incompleta.

O objetivo correto é:

evitar falhas previsíveis, tratar condições esperadas, preservar evidências nas falhas inesperadas e proteger a integridade dos dados.

No parque de Crichton, o problema não foi um único robô quebrar. O problema foi o sistema continuar vendendo normalidade enquanto os sinais mostravam que as garantias haviam desaparecido.



3. Condição excepcional não é automaticamente ABEND

Esta é a primeira grande curva da trilha.

Considere:

EXEC CICS READ
     FILE('CLIENTES')
     INTO(WS-CLIENTE)
     RIDFLD(WS-CHAVE)
END-EXEC.

Se a chave não existir, o CICS poderá retornar NOTFND. Isso é uma condição excepcional do comando READ, mas pode ser uma situação normal para o negócio: o usuário procurou um cliente que não está cadastrado.

O que acontecerá depende de como o programa foi preparado:

EstratégiaO que acontece
RESP e RESP2O programa recebe os códigos e decide
HANDLE CONDITIONO controle é desviado para uma rotina
IGNORE CONDITIONA ação padrão é suprimida para a condição
NOHANDLE no comandoO tratamento automático é suprimido naquele comando
Nenhuma proteçãoO CICS aplica a ação padrão, frequentemente um ABEND

Essa é a diferença entre um hóspede não encontrado no hotel e o Cowboy atravessando a recepção a tiros. Os dois são eventos fora do caminho feliz, mas não pertencem à mesma categoria.



4. RESP e RESP2: pergunte ao comando o que aconteceu

Para código COBOL estruturado, RESP e RESP2 geralmente tornam o fluxo mais claro:

01  WS-RESP   PIC S9(8) COMP VALUE ZERO.
01  WS-RESP2  PIC S9(8) COMP VALUE ZERO.

EXEC CICS READ
     FILE('CLIENTES')
     INTO(WS-CLIENTE)
     RIDFLD(WS-CHAVE)
     RESP(WS-RESP)
     RESP2(WS-RESP2)
END-EXEC

EVALUATE WS-RESP
    WHEN DFHRESP(NORMAL)
         PERFORM PROCESSAR-CLIENTE

    WHEN DFHRESP(NOTFND)
         PERFORM INFORMAR-CLIENTE-INEXISTENTE

    WHEN DFHRESP(NOTOPEN)
         PERFORM REGISTRAR-ERRO-TECNICO
         PERFORM ABORTAR-OPERACAO

    WHEN OTHER
         PERFORM REGISTRAR-RESPOSTA-INESPERADA
         PERFORM ABORTAR-OPERACAO
END-EVALUATE.

RESP fornece a condição principal. RESP2 oferece detalhe adicional cujo significado depende do comando e da resposta. Portanto, não existe um dicionário universal de RESP2: é preciso consultar a documentação do comando específico.

Também é preferível comparar com DFHRESP(NORMAL), DFHRESP(NOTFND) e outras constantes simbólicas, em vez de espalhar números mágicos pelo fonte. Daqui a dois anos, ninguém deveria precisar perguntar por que Igor escreveu IF WS-RESP = 13.

Dica de produção

Inicialize as variáveis, teste a resposta imediatamente depois do comando e preserve o contexto antes de executar outras operações CICS. O último comando pode alterar campos do EIB e deixar a equipe investigando o mensageiro em vez do atirador.



5. HANDLE CONDITION: coloque um xerife na esquina

HANDLE CONDITION associa condições CICS a rótulos:

EXEC CICS HANDLE CONDITION
     NOTFND(SEM-CLIENTE)
     NOTOPEN(ARQUIVO-FECHADO)
     IOERR(ERRO-DE-IO)
END-EXEC.

Quando uma dessas condições surgir em comando sujeito ao mecanismo, o controle poderá saltar para a rotina indicada.

É útil, especialmente em programas antigos ou em fluxos bem delimitados, mas exige cuidado. O tratamento fica ativo no nível lógico e pode capturar uma condição gerada longe do ponto onde foi declarado. Em um fonte grande, isso cria um roteiro de faroeste no qual o espectador precisa rever quarenta minutos para descobrir por que alguém entrou pela janela.

Para iniciantes, uma regra prática:

  • use RESP quando a decisão pertence à operação específica;

  • use HANDLE CONDITION quando um desvio controlado realmente melhora o desenho;

  • não misture estilos sem entender precedência e escopo;

  • nunca continue usando uma área de dados quando o comando que deveria preenchê-la falhou.



6. NOHANDLE: retirar o alarme não apaga a fumaça

NOHANDLE impede que os mecanismos automáticos de tratamento sejam aplicados àquele comando:

EXEC CICS READ
     FILE('CLIENTES')
     INTO(WS-CLIENTE)
     RIDFLD(WS-CHAVE)
     NOHANDLE
END-EXEC.

Isso não significa “ignore o erro e considere sucesso”.

Se a leitura falhar e o programa prosseguir:

PERFORM CALCULAR-LIMITE.

WS-CLIENTE pode conter zeros, dados antigos ou conteúdo inconsistente. O erro original era um NOTFND; o erro seguinte pode virar ASRA, cálculo incorreto ou, pior, uma decisão financeira válida sobre o cliente errado.

NOHANDLE sem verificação é Igor cobrindo os olhos do androide e anunciando que o Pistoleiro não consegue mais enxergá-lo.



7. HANDLE ABEND: a última barreira do parque

HANDLE ABEND instala uma saída de ABEND no nível lógico do programa:

EXEC CICS HANDLE ABEND
     PROGRAM('ERRPGM')
END-EXEC.

Em contextos compatíveis, também pode apontar para um rótulo:

EXEC CICS HANDLE ABEND
     LABEL(ROT-ABEND)
END-EXEC.

Ele não deve substituir o tratamento de condições previsíveis. Seu papel é receber falhas anormais, preservar informações e conduzir uma terminação ou recuperação controlada.

Imagine:

PROGA — saída A ativa
  └── LINK PROGB — saída B ativa
        └── LINK PROGC — nenhum handler
              └── ASRA

O CICS procura uma saída no nível atual. Não encontrando, sobe pelos níveis lógicos até localizar uma saída ativa. Se não houver nenhuma, a task termina anormalmente.

Existe apenas uma saída ativa por nível lógico. Declarar outra nesse mesmo nível desativa a anterior. Quando a saída recebe controle, o CICS a desativa antes de executar seu código, evitando reentrada infinita caso o próprio handler falhe.

É o Cowboy de Chapéu Preto atravessando Westworld, Medievalworld e Romanworld. Ele só para quando encontra alguém preparado — ou quando não resta mais parque.



8. CANCEL versus CANCEL: duas placas iguais em portas diferentes

O material que iniciou nossa conversa colocava “CANCEL versus HANDLE ABEND”, mas essa comparação pode induzir o iniciante ao erro.

EXEC CICS HANDLE ABEND
     CANCEL
END-EXEC.

Esse comando desativa a saída de ABEND do nível lógico atual. Ele não ordena, por si só, o encerramento imediato da task.

Já:

EXEC CICS ABEND
     CANCEL
END-EXEC.

é outra operação: cancela as saídas de ABEND em todos os níveis e força o término anormal.

ComandoSignificado
HANDLE ABEND PROGRAM(...)Ativa programa de tratamento
HANDLE ABEND LABEL(...)Ativa rotina local
HANDLE ABEND CANCELDesativa a saída do nível atual
HANDLE ABEND RESETReativa a saída após ela ter recebido controle
ABEND ABCODE('E001')Provoca ABEND definido pela aplicação
ABEND CANCELIgnora todas as saídas e termina a task

No CICS, contexto é munição. A mesma palavra, colocada em outro comando, produz outro resultado.



9. O erro mais perigoso: capturar o ABEND e dar RETURN

Chegamos à cena central.

Suponha uma transferência:

1. Debitar conta A
2. Creditar conta B
3. Gravar histórico
4. Enviar confirmação

O débito é realizado. Antes do crédito, o programa sofre ASRA. O handler registra “erro tratado” e executa:

EXEC CICS RETURN
END-EXEC.

Parece elegante. Não é.

Quando uma saída de ABEND termina com RETURN, o CICS pode devolver controle ao nível lógico superior como se o programa inferior tivesse retornado normalmente. Se a transação atualizou recursos recuperáveis e dependia do ABEND para provocar backout, o backout não ocorre; as alterações podem ser confirmadas.

Assim, uma rotina criada para proteger a aplicação pode transformar:

falha detectável + backout

em:

falha escondida + commit parcial

A própria IBM adverte que, quando é necessário preservar a integridade de recursos recuperáveis, a saída deve terminar com ABEND, não simplesmente retornar. Consulte How it works: Abend exit code.

Um desenho prudente:

ERRPGM-MAIN.

    PERFORM CAPTURAR-CONTEXTO
    PERFORM GRAVAR-LOG-SANITIZADO
    PERFORM NOTIFICAR-OPERACAO

    EXEC CICS ABEND
         ABCODE('E001')
    END-EXEC.

O handler pode registrar e notificar. Mas, se a unidade de trabalho precisa ser desfeita, deve permitir ou provocar o término anormal adequado.

Matar o alarme não mata o Cowboy.



10. Backout, commit e unidade de trabalho

Uma Unit of Work agrupa alterações que devem ser tratadas como uma unidade coerente.

UPDATE VSAM
   +
UPDATE Db2
   +
mensagem persistente
   =
trabalho ainda não confirmado

Quando ocorre um syncpoint bem-sucedido, as alterações recuperáveis são confirmadas. Quando uma task termina anormalmente em condições apropriadas, o CICS pode executar dynamic transaction backout.

Mas nem tudo é automaticamente recuperável:

  • um arquivo precisa estar definido e operado como recurso recuperável;

  • integrações externas podem não participar do mesmo escopo transacional;

  • uma chamada HTTP pode ter sido processada embora a resposta tenha se perdido;

  • uma mensagem pode pertencer a outra unidade de trabalho;

  • efeitos fora do CICS podem exigir compensação;

  • uma UOW distribuída pode ficar in-doubt.

Por isso, “deu ABEND, então tudo voltou” é uma crença perigosa.

Antes de repetir a transação, confirme:

  1. Houve backout?

  2. Algum syncpoint ocorreu antes da falha?

  3. O Db2 confirmou alterações?

  4. A mensagem MQ foi publicada?

  5. O sistema remoto recebeu a solicitação?

  6. Existe chave de idempotência?

  7. A primeira tentativa pode ter terminado com sucesso apesar da resposta perdida?

Retry sem conhecer o estado anterior é o equivalente operacional de colocar dois Pistoleiros no parque para resolver o problema do primeiro.



11. ASRA — o anfitrião perdeu o controle do próprio corpo

ASRA indica que a task terminou por causa de um program check.

Possíveis causas:

  • dado não numérico em operação decimal;

  • subscrito fora dos limites;

  • referência inválida à memória;

  • endereço corrompido;

  • storage já liberado;

  • incompatibilidade de parâmetros entre chamador e chamado;

  • copybooks divergentes;

  • comprimento incorreto;

  • corrupção de storage ocorrida antes;

  • erro em COBOL, PL/I, assembler ou componente chamado.

ASRA não é a causa-raiz; é a categoria. A investigação precisa localizar:

  • programa;

  • offset;

  • statement correspondente no compile listing;

  • PSW;

  • registradores;

  • traceback do Language Environment;

  • áreas de dados envolvidas;

  • versão exata do módulo carregado;

  • cadeia de LINK, XCTL ou chamadas.

Se o load module em execução não corresponde ao listing usado na investigação, o offset pode levar a uma linha inocente. É como analisar o mapa de Westworld da semana passada depois que alguém mudou o saloon de lugar.

A definição oficial pode ser consultada em IBM — ASRA.



12. AICA — o Cowboy que galopa em círculos

AICA indica uma possível runaway task: a task consumiu tempo de execução além do limite considerado aceitável.

Exemplo:

PERFORM UNTIL WS-FIM = 'S'
    ADD 1 TO WS-CONTADOR
END-PERFORM.

Se WS-FIM nunca mudar, temos um loop clássico.

Mas AICA não prova automaticamente “loop infinito”. Também pode sinalizar:

  • processamento legítimo grande demais para uma transação online;

  • algoritmo ineficiente;

  • ausência de pontos de suspensão;

  • volume anormal;

  • configuração inadequada do intervalo de runaway;

  • rotina batch colocada dentro do CICS;

  • instrumentação alterando o tempo;

  • laço que deveria avançar um cursor, mas não avança.

O CICS consegue detectar determinados loops comparando a execução com o intervalo configurado. Algumas chamadas que suspendem a task podem alterar esse comportamento. A investigação oficial está em IBM — AICA.

O conserto não é simplesmente aumentar o timeout. Primeiro determine se o trabalho pertence ao ambiente online, se pode ser paginado, dividido, agendado ou redesenhado.

Dar mais tempo a um loop infinito apenas permite que o Cowboy cavalgue mais longe.



13. AEI9 — a pista errada do infográfico

Aqui existe uma correção objetiva e importante.

O infográfico original apresentou AEI9 como algo relacionado a comando ou parâmetro inválido. AEI9 corresponde a MAPFAIL.

MAPFAIL costuma aparecer no BMS quando:

  • nenhum dado utilizável foi transmitido;

  • o usuário acionou uma tecla sem modificar campos;

  • a entrada chegou sem o formato esperado;

  • o programa esperava dados mapeados, mas recebeu entrada não formatada.

INVREQ, condição associada a requisição inválida, aparece como AEIP nessa família. AEIS corresponde a NOTOPEN.

CódigoCondição
AEI9MAPFAIL
AEIPINVREQ
AEISNOTOPEN
AEIMNOTFND
AEI0PGMIDERR

Essa diferença não é preciosismo. Se o operador procura parâmetro inválido diante de AEI9, perderá tempo examinando o comando errado quando deveria investigar entrada de terminal e BMS. Veja IBM — MAPFAIL.



14. EIB: o bolso do casaco do visitante

O EXEC Interface Block contém informações sobre o contexto da task:

  • EIBTRNID: identificador da transação;

  • EIBTASKN: número da task;

  • EIBTRMID: terminal;

  • EIBDATE e EIBTIME: data e hora;

  • EIBFN: função do último comando;

  • EIBRESP: resposta principal;

  • EIBRESP2: resposta secundária;

  • EIBCALEN: tamanho da COMMAREA recebida;

  • EIBAID: tecla de atenção recebida.

O detalhe crítico é “último comando”. Se o programa de erro executar vários comandos antes de preservar o EIB, poderá sobrescrever a evidência original.

MOVE EIBTRNID TO LOG-TRANSACAO
MOVE EIBTASKN TO LOG-TASK
MOVE EIBTRMID TO LOG-TERMINAL
MOVE EIBFN    TO LOG-FUNCAO
MOVE EIBRESP  TO LOG-RESP
MOVE EIBRESP2 TO LOG-RESP2.

Faça a captura cedo. Depois sanitize e registre.

Também não grave indiscriminadamente senhas, tokens, PINs, CVV, chaves, documentos completos ou COMMAREAs inteiras. Um log excelente para diagnóstico pode ser excelente também para um invasor.



15. Passo a passo do suporte de produção

Passo 1 — Identifique a visita

Colete região, transação, task, usuário, terminal ou canal, horário e correlation ID.

Passo 2 — Leia as mensagens associadas

O código de ABEND sozinho não conta a história. Procure mensagens DFH, logs da região, JES, Language Environment, Db2, MQ e demais componentes relacionados.

Passo 3 — Preserve dump e trace

Não suprima dumps por reflexo. Dump é caro quando existe em excesso, mas ausência de evidência também custa. A política deve equilibrar diagnóstico, volume, privacidade e recorrência.

Passo 4 — Classifique

É program check, runaway, condição EXEC não tratada, autorização, indisponibilidade, purge, timeout, falha distribuída ou ABEND criado pela aplicação?

Passo 5 — Localize o ponto

Para condição CICS, identifique comando, RESP, RESP2, parâmetros e recurso.

Para ASRA, use dump, offset, listing, PSW, registradores e traceback.

Passo 6 — Descubra o que mudou

  • deploy recente;

  • copybook alterado;

  • módulo sem NEWCOPY ou PHASEIN adequado;

  • definição de arquivo;

  • mudança RACF;

  • mapa BMS regenerado;

  • aumento de volume;

  • alteração no programa chamador;

  • erro restrito a uma região ou registro.

Passo 7 — Verifique integridade

Determine commit, backout, syncpoints, mensagens enviadas e efeitos externos.

Passo 8 — Só então decida

Corrigir, recuperar, compensar, reiniciar, repetir de modo idempotente ou escalar.



16. CEDF: visitar o parque com as luzes acesas

CEDF ajuda a observar interativamente o fluxo de comandos CICS. Ele pode mostrar entrada e saída de comandos, condições, opções e sequência de execução.

Mas não é máquina do tempo.

CEDF:

  • ajuda a reproduzir;

  • revela o fluxo;

  • permite examinar comandos;

  • não substitui dump;

  • pode alterar timing;

  • pode esconder problemas concorrentes;

  • exige extremo cuidado em produção.

A combinação forte é:

CEDF para compreender
+ dump para congelar a falha
+ trace para reconstruir a sequência
+ logs para correlacionar componentes
+ listing para localizar a instrução

Observar o Pistoleiro em câmera lenta ajuda. Ainda precisamos saber quem liberou a arma, qual trava falhou e se a sala de controle perdeu energia.



17. Curiosidades escondidas no parque

Easter egg 1 — o Pistoleiro já havia cavalgado antes

O visual de Yul Brynner em Westworld foi construído para lembrar Chris Adams, personagem interpretado por ele em The Magnificent SevenSete Homens e um Destino. Roupa escura, postura e presença criam uma referência cinematográfica deliberada. O robô parece uma cópia de outro cowboy, quase como um módulo recompilado a partir de um fonte antigo.

Easter egg 2 — visão digital antes de CGI virar rotina

O filme foi pioneiro no uso de processamento digital de imagem em longa-metragem para simular a visão pixelada do Pistoleiro. Décadas antes de dashboards coloridos e observabilidade distribuída, Crichton já nos colocava dentro do “sensor” da máquina.

Easter egg 3 — três mundos, três ambientes

Romanworld, Medievalworld e Westworld parecem ambientes separados, mas os defeitos atravessam fronteiras. É uma boa lembrança de que regiões, serviços e plataformas isolados no organograma podem compartilhar dependências invisíveis.

Easter egg 4 — Crichton repetiria a pergunta

Anos depois, Jurassic Park retomaria a ideia de uma atração tecnológica complexa, vendida como controlável, cuja segurança dependia de camadas frágeis e excesso de confiança corporativa.

Easter egg 5 — a frase de marketing

O slogan de Delos prometia férias extraordinárias. Depois do desastre, a promessa volta com ironia. Em TI, o equivalente é o slide que anuncia “zero incidentes” antes de a primeira evidência chegar ao console.

Informações históricas do filme podem ser consultadas na página oficial de Michael Crichton e no relato técnico da American Society of Cinematographers.



18. O mapa de decisão do jovem padawan

Quando um comando CICS não retorna NORMAL, pergunte:

  1. A condição é esperada pelo negócio?

  2. Ela pertence ao comando atual?

  3. Posso tratá-la localmente com RESP?

  4. Alguma área de dados deixou de ser preenchida?

  5. É seguro continuar?

  6. Houve atualização recuperável?

  7. Preciso provocar backout?

  8. Existe efeito fora da unidade de trabalho?

  9. Preciso de dump?

  10. Tenho evidência suficiente antes de emitir outro comando?

Quando ocorre ABEND:

  1. Preserve o código original.

  2. Capture o contexto.

  3. Não mascare falha de integridade.

  4. Não execute RETURN por hábito.

  5. Não repita a transação cegamente.

  6. Não confunda o código com a causa-raiz.

  7. Confirme o estado da UOW.

  8. Diferencie recuperação técnica de recuperação do negócio.



Epílogo — O Cowboy fecha o chamado?

No início de Westworld, os visitantes acreditam que o parque é seguro porque os androides foram programados para obedecer. A confiança nasce da regra escrita, não da evidência operacional.

No CICS, acontece algo parecido. O programa foi testado. O arquivo é recuperável. O handler existe. O log foi criado. A mensagem “erro tratado” apareceu. Tudo isso ajuda, mas nada disso prova que a transação terminou de forma íntegra.

HANDLE ABEND não é um colete à prova de balas. É uma saída program-level que oferece à aplicação uma última oportunidade de decidir o que fazer diante do término anormal.

Às vezes, a decisão será limpar recursos e continuar em um nível superior.

Às vezes, será converter uma falha técnica em resposta controlada.

Às vezes, será registrar o contexto e emitir outro ABEND para garantir o backout.

E muitas vezes, o ato mais profissional será admitir que o estado não é confiável e impedir que a task confirme uma meia verdade.

O programador iniciante aprende sintaxe:

EXEC CICS HANDLE ABEND
     PROGRAM('ERRPGM')
END-EXEC.

O profissional aprende responsabilidade:

Capturar uma falha não significa recuperar o negócio; remover o alarme não restaura a integridade; e nenhum RETURN deve atravessar a porta antes que alguém confira o que aconteceu com o commit e o backout.

Na última cena, o parque permanece silencioso. A sala de controle já não controla nada. Peter Martin sobrevive, mas olha ao redor sem saber exatamente onde terminou a fantasia e começou a falha.

No console do CICS, o Cowboy de Chapéu Preto deixa sua última mensagem:

ABEND CODE IS NOT ROOT CAUSE

Igor olha para o dump, tira lentamente o dedo do CANCEL e finalmente chama o programador que guardou o compile listing correto.

O boteco pode reabrir.

Mas somente depois do backout.



Referências essenciais



sexta-feira, 12 de junho de 2026

Blast Radius: Por Que um Pequeno Erro Pode Derrubar um Banco Inteiro

 

Bellacosa Mainframe e o blast radius em desenvolvimento de software

Blast Radius: Por Que um Pequeno Erro Pode Derrubar um Banco Inteiro

Uma das perguntas mais importantes da engenharia moderna

Imagine que você acabou de entrar em uma grande instituição financeira.

Você é um desenvolvedor COBOL Jr.

Recebe uma tarefa aparentemente simples.

Alterar uma rotina de validação em um programa batch.

O código possui apenas algumas linhas.

A mudança é pequena.

O teste passou.

O deploy foi aprovado.

Tudo parece sob controle.

Dois dias depois surge uma reunião de crise.

Executivos estão reunidos.

Gerentes estão nervosos.

Equipes de infraestrutura trabalham durante a madrugada.

Milhões de registros foram processados incorretamente.

O prejuízo é enorme.

E então alguém faz uma pergunta que todo arquiteto experiente conhece:

Qual era o Blast Radius dessa mudança?

Essa pergunta vale mais do que qualquer revisão de código.

Mais do que qualquer ferramenta de monitoramento.

Mais do que qualquer framework moderno.

Porque ela determina o tamanho potencial do desastre.


O que significa Blast Radius?

A tradução literal seria:

Raio de Explosão.

O termo vem do universo militar.

Quando ocorre uma explosão, existe uma área diretamente afetada.

Quanto maior a explosão, maior o raio de destruição.

A engenharia de software adotou exatamente a mesma ideia.

Quando um sistema falha, uma pergunta precisa ser respondida:

Quantas pessoas, sistemas, operações ou clientes serão impactados?

Essa área de impacto é chamada Blast Radius.


O erro que afeta um cliente

Imagine um programa COBOL responsável por atualizar dados cadastrais.

Um erro afeta:

1 cliente

Problema?

Sim.

Crise?

Provavelmente não.

O impacto é localizado.

O Blast Radius é pequeno.


O erro que afeta um banco inteiro

Agora imagine um programa responsável pela compensação financeira nacional.

Um erro afeta:

30 milhões de clientes

Mesma quantidade de linhas alteradas.

Mesmo programador.

Mesmo tipo de erro.

Resultado completamente diferente.

Por quê?

Porque o Blast Radius mudou.


A pergunta que diferencia um programador de um engenheiro

O desenvolvedor iniciante normalmente pergunta:

Meu código funciona?

O engenheiro experiente pergunta:

O que acontece se ele falhar?

Essa mudança de mentalidade é uma das maiores evoluções na carreira de tecnologia.

Porque sistemas críticos não são avaliados apenas pelo sucesso.

Eles são avaliados pela forma como falham.


O mito do pequeno erro

Existe uma crença perigosa em ambientes corporativos.

"Foi só uma alteração pequena."

O tamanho do código raramente determina o tamanho do impacto.

Um único caractere já derrubou sistemas inteiros.

Um único parâmetro incorreto já gerou perdas milionárias.

Uma única configuração errada já interrompeu operações globais.

O impacto depende do Blast Radius.

Não da quantidade de código.


O universo COBOL e o poder invisível

Desenvolvedores COBOL trabalham em uma situação peculiar.

Muitas vezes manipulam sistemas que movimentam bilhões de reais diariamente.

Mas a interface parece simples.

Uma tela verde.

Alguns arquivos.

JCLs.

Datasets.

Rotinas batch.

Tudo parece tranquilo.

Até que alguém descobre que aquele programa processa:

  • contas correntes;

  • cartões;

  • empréstimos;

  • investimentos;

  • liquidações;

  • compensações.

De repente o código ganha outra dimensão.


O efeito dominó

Imagine uma falha em um cadastro.

Cliente incorreto.

Esse dado alimenta:

  • CRM;

  • antifraude;

  • cobrança;

  • compliance;

  • atendimento;

  • relatórios regulatórios.

Agora uma pequena falha inicial se transforma em dezenas de falhas secundárias.

Isso é amplificação de Blast Radius.


O conceito de dependências

Sistemas modernos não vivem isolados.

Um programa chama outro.

Que chama outro.

Que alimenta outro.

Que gera arquivos para outro.

O resultado é uma rede gigantesca.

Quando um componente falha, o impacto se propaga.

Como peças de dominó.


O exemplo do CPF inválido

Imagine uma rotina simples.

Um CPF inválido passa pela validação.

O erro parece pequeno.

Mas esse dado segue adiante.

Abre conta.

Gera cartão.

Produz relatórios.

Entra em auditorias.

Alimenta modelos analíticos.

Meses depois ninguém sabe mais onde o problema começou.

O Blast Radius cresceu silenciosamente.


O incidente do Nubank como estudo de caso

O episódio envolvendo o falso aviso de liquidação trouxe uma lição interessante.

Independentemente dos detalhes internos, a pergunta arquitetural é:

Qual era o Blast Radius daquele processo?

Se a mensagem atingisse:

10 clientes

O incidente seria pequeno.

Se atingir milhões:

O cenário muda completamente.

A mesma falha produz consequências exponencialmente maiores.


Blast Radius e ambientes de produção

Uma regra simples:

Quanto mais próximo da produção, maior o Blast Radius.

Ambiente de desenvolvimento:

Impacto quase zero.

Homologação:

Impacto limitado.

Produção:

Impacto real.

Produção financeira:

Impacto potencialmente gigantesco.

É por isso que instituições financeiras possuem tantos controles.

Não por burocracia.

Mas porque o custo do erro é enorme.


O perigo dos batches

O mundo COBOL é dominado por processamento em massa.

Um programa pode executar durante horas.

Processando milhões de registros.

O problema é simples.

Se houver um erro:

Ele será repetido milhões de vezes.

Um erro individual torna-se um erro industrializado.


O erro multiplicado

Imagine:

1 registro incorreto

Sem batch:

impacto pequeno.

Agora imagine:

50 milhões de registros

Processados pela mesma lógica defeituosa.

O erro não mudou.

O Blast Radius mudou.


Como arquitetos pensam

Arquitetos raramente perguntam:

"Qual tecnologia usamos?"

Eles perguntam:

"Qual o pior cenário possível?"

Essa pergunta direciona toda a arquitetura.

Porque sistemas críticos são construídos para sobreviver a falhas.

Não apenas para funcionar.


Blast Radius e permissões

Um desenvolvedor possui acesso de leitura.

Blast Radius reduzido.

Um desenvolvedor possui acesso irrestrito.

Blast Radius elevado.

É por isso que ambientes maduros trabalham com:

  • menor privilégio;

  • segregação;

  • controle de acesso;

  • aprovações.

Tudo isso é gestão de Blast Radius.


Blast Radius e banco de dados

Imagine um comando SQL.

Primeiro cenário:

UPDATE CLIENTES
SET STATUS='A'
WHERE ID=100;

Impacto:

um cliente.

Segundo cenário:

UPDATE CLIENTES
SET STATUS='A';

Impacto:

todos os clientes.

A diferença visual é mínima.

A diferença operacional é gigantesca.


O princípio da contenção

Existe uma palavra muito importante.

Contenção.

Todo sistema moderno deveria conter falhas.

Não espalhá-las.

Por isso empresas investem em:

  • segmentação;

  • isolamento;

  • partições;

  • zonas independentes.

O objetivo é impedir que uma falha local se torne global.


O conceito de células

Empresas como Amazon popularizaram a ideia de Cell Architecture.

Em vez de uma estrutura única gigante.

Criam-se células menores.

Se uma célula falhar:

As demais continuam operando.

Isso reduz drasticamente o Blast Radius.


Mainframe já fazia isso há décadas

Curiosamente, ambientes mainframe utilizavam conceitos semelhantes muito antes da computação em nuvem.

Exemplos:

  • LPARs;

  • regiões CICS;

  • filas separadas;

  • ambientes segregados;

  • jobs independentes.

A filosofia era exatamente a mesma.

Conter impactos.


O problema do compartilhamento excessivo

Quanto mais sistemas compartilham recursos, maior o Blast Radius.

Banco compartilhado.

Fila compartilhada.

Storage compartilhado.

Processamento compartilhado.

Tudo isso cria pontos únicos de falha.

Um problema em um componente afeta dezenas de outros.


O conceito de Blast Radius Humano

Pouca gente fala sobre isso.

Mas pessoas também possuem Blast Radius.

Imagine:

Um único operador consegue executar qualquer comando em produção.

Blast Radius enorme.

Agora imagine:

Necessidade de aprovação dupla.

Blast Radius reduzido.

A governança existe para limitar o alcance dos erros humanos.


O papel dos Guard Rails

Blast Radius e Guard Rails caminham juntos.

Guard Rails tentam impedir erros.

Blast Radius tenta limitar consequências.

Exemplo:

Guard Rail:

impedir exclusão acidental.

Blast Radius:

caso a exclusão ocorra, limitar o impacto.

São conceitos complementares.


Rollout gradual

Uma das formas mais modernas de controlar Blast Radius é o rollout progressivo.

Em vez de liberar uma mudança para todos.

Liberamos para poucos.

Por exemplo:

1%.

Depois 5%.

Depois 10%.

Depois 100%.

Se houver erro, ele será detectado cedo.

O impacto permanece pequeno.


O medo saudável da produção

Existe uma característica interessante nos profissionais experientes de mainframe.

Eles respeitam produção.

Não porque tenham medo da tecnologia.

Mas porque entendem o Blast Radius.

Produção concentra:

  • clientes;

  • dinheiro;

  • contratos;

  • obrigações regulatórias;

  • reputação.

Uma pequena falha pode produzir consequências gigantescas.


Observabilidade e Blast Radius

Você não controla aquilo que não consegue enxergar.

Por isso monitoramento é fundamental.

Imagine um batch que normalmente processa:

500 mil registros

Hoje processou:

50 milhões

Algo claramente está errado.

Um sistema observável detecta rapidamente.

Quanto mais cedo o problema é identificado, menor o Blast Radius.


O custo da reputação

Em bancos existe um ativo invisível.

Confiança.

Quando uma falha afeta poucos clientes, a recuperação costuma ser simples.

Quando afeta milhões, surge um problema adicional.

Reputação.

O Blast Radius passa a incluir:

  • imprensa;

  • investidores;

  • reguladores;

  • mercado.

O dano deixa de ser apenas tecnológico.


O exercício mental que todo COBOL Jr deveria fazer

Antes de qualquer alteração, pergunte:

Se eu errar:

  • Quantos clientes serão impactados?

  • Quantos sistemas dependem disso?

  • Existe rollback?

  • Existe monitoramento?

  • Existe plano de contingência?

  • Existe limite operacional?

  • Existe validação?

  • Existe segregação?

Essas perguntas valem mais do que qualquer linha de código.


A verdadeira maturidade profissional

Existe um momento em que o desenvolvedor deixa de ser apenas um programador.

Ele passa a enxergar sistemas.

Passa a enxergar operações.

Passa a enxergar negócios.

Passa a enxergar riscos.

Nesse momento surge uma nova pergunta.

Não mais:

O programa funciona?

Mas sim:

Qual é o Blast Radius se ele parar de funcionar?

Essa mudança de perspectiva transforma a forma de desenvolver software.


Conclusão

Blast Radius é um dos conceitos mais importantes da engenharia moderna porque nos obriga a pensar além do código.

Ele nos força a enxergar impacto.

A enxergar consequências.

A enxergar riscos.

Para um desenvolvedor COBOL Jr, compreender Blast Radius significa entender que o tamanho de uma alteração não determina sua importância.

Uma linha de código pode alterar milhões de contas.

Um único parâmetro pode interromper operações nacionais.

Uma pequena falha pode se propagar por dezenas de sistemas.

Os melhores engenheiros não são aqueles que acreditam que nunca errarão.

São aqueles que projetam sistemas assumindo que erros inevitavelmente acontecerão.

E quando eles acontecerem, o objetivo não será impedir a explosão.

Será garantir que o raio da explosão seja o menor possível.

Esse é o verdadeiro significado de Blast Radius.


domingo, 3 de maio de 2026

⚡💣 LAB CICS — MEM CRÍTICO 🚨 “QUANDO A MEMÓRIA ACABA… O CICS PEDE SOCORRO” 🚨

 

Bellacosa Mainframe memoria critica no CICS

⚡💣 LAB CICS — MEM CRÍTICO

🚨 “QUANDO A MEMÓRIA ACABA… O CICS PEDE SOCORRO” 🚨

👉 Tema: SOS (Short on Storage) + degradação + decisão de failover


🎬 🎯 CENÁRIO

Você está operando uma região do
IBM CICS

🕐 14:32 — horário crítico
📍 Região: CICSPRD1
📍 Ambiente: Produção


💥 ALERTAS INICIAIS

  • Tempo de resposta subindo
  • Tasks WAITING
  • CPU irregular
  • Storage aumentando rápido

💣 LOGS (CSMT)

DFHSM0133 Short on storage condition detected
DFHSM0606 Storage violation detected

👉 Tradução Bellacosa:

“O CICS está ficando sem memória — e isso escala rápido.”


🧠🔥 FASE 1 — DIAGNÓSTICO INICIAL

🔎 Comando:

CEMT I SYS

🔥 Resultado típico:

  • Storage > 90%
  • Tasks acumulando
  • Sistema degradando

❓ O que você faz?

A) Reinicia CICS
B) Ignora
C) Analisa storage
D) Derruba tudo


✅ RESPOSTA: C

👉 Reiniciar agora pode piorar
👉 Você precisa entender quem está consumindo storage


🔍 FASE 2 — INVESTIGAÇÃO DE STORAGE

🔎 Ver tasks:

CEMT I TASK

👉 Procure:

  • Tasks longas
  • Muitas instâncias
  • Status WAITING

💡 Padrão clássico:

  • Programa não liberando storage
  • Loop com GETMAIN
  • Leak de memória

📊 FASE 3 — IDENTIFICAR VILÃO

🔎 Filtro:

CEMT I TASK TRA(ORDR)

👉 Resultado:

  • Muitas tasks
  • Alto consumo
  • Crescendo continuamente

❓ Diagnóstico provável:

A) CPU
B) Storage leak
C) Rede
D) MQ


✅ RESPOSTA: B

🔥 Você está vendo um memory leak em CICS


☠️💣 FASE 4 — CONTENÇÃO IMEDIATA

Agora vem decisão crítica.

🎯 Objetivo:

  • parar consumo
  • evitar colapso

💥 Ações:

1. Derrubar tasks críticas:

CEMT SET TASK(501) PURGE

Se necessário:

CEMT SET TASK(501) FORCEPURGE

2. Bloquear transação:

CEMT SET TRAN(ORDR) DISABLED

👉 Isso é essencial.


🧬 FASE 5 — SITUAÇÃO PIORA 😈

Mesmo após purge:

  • Storage não libera totalmente
  • Região continua degradando

👉 Isso acontece porque:

  • Fragmentação
  • Storage preso
  • Controle interno comprometido

🚨 FASE 6 — DECISÃO CRÍTICA (NÍVEL SYSPROG)

❓ O que fazer agora?

A) Continuar purge
B) Reiniciar região
C) Acionar failover
D) Ignorar


✅ RESPOSTA IDEAL: C

👉 Você entra no modo resiliência


🌍⚡ FAILOVER COM GDPS

Utilizando:

IBM GDPS


💥 Ação:

  • Transferir workload
  • Ativar região standby
  • Redirecionar usuários

🎯 Resultado esperado:

  • Continuidade de serviço
  • Zero downtime perceptível (ou mínimo)

🧯 FASE 7 — ESTABILIZAÇÃO

Após failover:

  • Região secundária assume
  • Sistema normaliza
  • Usuários voltam

🔬 FASE 8 — ANÁLISE PROFUNDA

Agora você investiga a causa real.

🔎 Ferramentas:

  • IBM IPCS
  • IBM Fault Analyzer

💣 Descoberta:

  • Programa COBOL com loop de GETMAIN
  • Sem FREEMAIN
  • Leak progressivo

🔧 FASE 9 — CORREÇÃO DEFINITIVA

📋 Ações:

  • Corrigir código
  • Garantir FREEMAIN
  • Revisar uso de storage
  • Testar em QA

🧠💡 LIÇÕES DE OURO

👉 SOS nunca é “só performance”
👉 É risco de colapso total

👉 Sempre:

  • monitore storage
  • detecte crescimento anormal
  • tenha failover preparado

🧩😄 EASTER EGGS

  • “SOS não avisa duas vezes”
  • “Se chegou no SOS… alguém esqueceu FREEMAIN”
  • “Memory leak em CICS é assassino silencioso”

🏁 SCORE FINAL

CritérioResultado
Diagnóstico🧠 Excelente
Tempo de reação⚡ Crítico
Contenção🎯 Precisa
Resiliência🛡️ Nível enterprise

🎯💬 FECHAMENTO

Esse lab é o divisor de águas.

👉 Aqui você deixa de ser operador
👉 e vira engenheiro de sobrevivência do mainframe



sábado, 2 de maio de 2026

🚨💥 SIMULADOR CICS — “GUERRA EM PRODUÇÃO” 💥🚨

 

Bellacosa Mainframe apresenta um Simulador CICS

🚨💥 SIMULADOR CICS — “GUERRA EM PRODUÇÃO” 💥🚨

🎮 Modo: Interativo | 🎯 Objetivo: Restaurar o serviço sem causar dano colateral

Você está no comando de uma região do IBM CICS em produção.


🎬 CENÁRIO INICIAL

🕐 10:02 — Pico de acesso
📍 Região: CICS01
📍 Aplicação crítica: pagamentos

💥 Sintomas:

  • Tempo de resposta > 5s
  • CPU subindo rápido
  • Usuários travando
  • Chamados explodindo 😄

🧠 FASE 1 — PRIMEIRA DECISÃO

Você precisa agir rápido.

❓ O que você faz primeiro?

A) Reinicia o CICS
B) Analisa logs e tasks
C) Derruba todas as tasks
D) Ignora (pode ser pico)

👉 Escolha mentalmente antes de continuar


✅ RESPOSTA CORRETA: B

👉 Reiniciar = impacto massivo
👉 Derrubar tudo = caos
👉 Ignorar = carreira curta 😄


🔍 FASE 2 — INVESTIGAÇÃO

Você executa:

CEMT I TASK

🔥 Resultado:

  • 40 tasks da transação PAY1
  • Todas RUNNING
  • Mesmo USERID

❓ Próxima ação?

A) Esperar normalizar
B) Filtrar por transação
C) Derrubar aleatoriamente
D) Reiniciar região

👉 Escolha…


✅ RESPOSTA: B

CEMT I TASK TRA(PAY1)

👉 Agora você tem visibilidade total


📊 FASE 3 — DIAGNÓSTICO

Você analisa uma task:

CEMT I TASK TAS(401)

🔎 Observação:

  • CPU TIME alto
  • STATUS: RUNNING
  • Sem I/O

👉 Isso indica:

A) Espera de recurso
B) Loop CPU
C) Falha de rede
D) Storage baixo


✅ RESPOSTA: B (LOOP CPU)

🔥 Você achou o vilão.


☠️ FASE 4 — DECISÃO CRÍTICA

Agora vem a parte que separa operador de sysprog.

❓ O que fazer?

A) PURGE uma task
B) FORCEPURGE todas
C) Desabilitar transação
D) Nada


✅ RESPOSTA IDEAL: A + C

💥 Execução:

CEMT SET TASK(401) PURGE

Depois:

CEMT SET TRAN(PAY1) DISABLED

👉 Você:

  • remove impacto imediato
  • evita novas ocorrências

🧬 FASE 5 — INVESTIGAÇÃO PROFUNDA

Agora você precisa entender a causa.

💥 Gerar dump:

CEMT SET TRD(PAY1) DUMP

🔎 Análise com:

  • IBM IPCS
  • IBM Fault Analyzer

💣 Resultado:

  • Loop em programa COBOL
  • Falta de condição de saída

👉 Erro clássico de desenvolvimento 😄


🧯 FASE 6 — ESTABILIZAÇÃO

Você monitora:

CEMT I SYS

✅ Resultado:

  • CPU normalizando
  • Tasks reduzindo
  • Usuários voltando

🔧 FASE 7 — PÓS-INCIDENTE

Agora entra maturidade real.

📋 Ações obrigatórias:

  • Corrigir código
  • Criar alerta de CPU
  • Monitorar transação
  • Revisar deploy

🏁 RESULTADO FINAL

🧾 SCORE

CritérioResultado
Tempo de reação⚡ Excelente
Impacto evitado🛡️ Alto
Diagnóstico🧠 Correto
Ação🎯 Precisa

👉 🎉 Você salvou a produção.


🧩😄 VARIAÇÕES DO SIMULADOR (PRÓXIMO NÍVEL)

Se quiser evoluir o treinamento:

💣 Cenário 2

  • Deadlock com DB2

💥 Cenário 3

  • MQ travando fila

🔥 Cenário 4

  • SOS (Short on Storage)

⚡ Cenário 5

  • Região inteira degradando

🎯💬 FECHAMENTO

Esse tipo de simulador treina:

  • raciocínio sob pressão
  • tomada de decisão
  • domínio real de CICS

👉 Porque no mundo real:

“Quem hesita… derruba produção.”

 

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...