- Castro/
- blog/
- Out of host capacity na OCI durante resize: como automatizar retries sem criar um loop cego/
Out of host capacity na OCI durante resize: como automatizar retries sem criar um loop cego
Como tratar Out of host capacity como condição retryable em resize OCI com janela operacional, locks, limite de tentativas e validação explícita do resultado.
Out of host capacity na OCI é um erro meio ingrato.
A configuração que você pediu pode ser válida, a instância pode estar saudável e a região pode simplesmente não ter capacidade disponível naquele momento para executar o resize.
Se a operação é importante, duas respostas ruins aparecem rápido:
- ficar repetindo o comando manualmente;
- criar um
while trueagressivo e torcer para uma tentativa passar.
Em uma automação real de resize, o caminho foi tratar capacity como uma condição operacional retryable, mas com limites claros.
A operação continuava sendo resize, não criação de VM #
Este artigo é deliberadamente separado da pauta sobre falta de capacidade ao criar uma VM ARM.
A fonte recuperada aqui é de atualização de shape/configuração de uma instância existente.
O comando central era equivalente a:
| |
Se a OCI devolvia capacity, a automação podia tentar novamente depois.
Isso não autoriza dizer que o mesmo fluxo foi usado para provisionar uma instância nova.
Nem todo erro entra em retry #
Um dos pontos mais importantes do script era classificar o erro.
Entre as mensagens tratadas como temporárias/retryable estavam padrões como:
| |
A ideia é simples:
| |
Sem essa separação, uma credencial inválida ou um parâmetro errado pode ficar sendo repetido por horas sem qualquer chance de sucesso.
Retry precisa ter contador #
Na rotina recuperada, esgotar as tentativas gerava um estado explícito de falta de capacidade.
Algo próximo de:
| |
Esse último trecho é importante.
A automação não deveria deixar dúvida sobre o estado final quando nenhuma tentativa conseguiu aplicar o resize.
O operador precisa saber:
| |
A fila automática não era um loop apertado #
Outra camada da solução agendava novas tentativas com intervalo operacional.
A política recuperada usava 20 minutos entre tentativas, com fila serializada e locks para evitar concorrência.
Também havia uma janela de operação:
| |
O objetivo é bem diferente de:
| |
Uma automação de capacity precisa respeitar o provedor e a própria operação.
Lock evita dois processos tentando o mesmo resize #
Retry agendado tem um risco que aparece rápido: uma execução demora, outra começa e as duas passam a operar sobre a mesma instância.
Por isso o fluxo usava serialização/locks.
Conceitualmente:
| |
Sem lock, o scheduler pode transformar tolerância a erro em concorrência acidental.
Capacity não deveria ser tratada como falha fatal imediata #
No playbook/orquestração, Out of host capacity era classificado como aviso operacional.
Isso permitia distinguir:
| |
Essa taxonomia melhora bastante relatório e automação.
Se todo erro vira vermelho fatal, o operador precisa reler log para descobrir que, na verdade, só faltou capacidade no host físico da OCI naquele momento.
Mas sucesso também precisava ser validado #
A automação não parava no retorno do comando.
Depois de a instância voltar ao estado esperado, o sizing deveria ser comparado com o solicitado.
Se houvesse divergência entre:
| |
versus o shape config efetivamente observado depois, o play deveria falhar.
Isso protege contra falso positivo do tipo:
comando terminou, então deve ter aplicado.
Em infraestrutura, resultado precisa ser lido de volta.
O que a fonte não prova #
A implementação tem um caminho de sucesso com mensagem de resize concluído e validado.
Mas o material recuperado não comprova que aquela ocorrência específica de falta de capacity terminou em sucesso depois de alguma tentativa futura.
O que ele comprova é:
- como a operação de resize era feita;
- quais erros eram considerados retryable;
- como o limite de tentativas era tratado;
- que, ao esgotar o lote observado, a instância permanecia inalterada;
- que existia uma política de reexecução agendada e serializada;
- que um sucesso precisava ser validado pelo sizing final.
Então não tem “final feliz” inventado aqui.
Um desenho simples para esse tipo de retry #
Eu modelaria algo assim:
| |
Isso é mais verboso que um loop.
E justamente por isso é mais operável.
Checklist para retry de capacity #
| |
O principal aprendizado #
Automatizar retry não é repetir comando.
É transformar uma condição transitória do provedor em um estado conhecido da operação.
No caso de Out of host capacity, isso significa saber quando repetir, quando parar e — principalmente — conseguir provar se a instância foi alterada ou permaneceu exatamente como estava.
Se o script não responde essas perguntas, ele só automatizou a ansiedade.
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.