Hot patch de RPO sem restart do AppServer
Tecnicas pra atualizar codigo em producao sem derrubar AppServer. UpdRPOData, recompile, troca seamless de RpoCustom.
Reiniciar AppServer derruba todos os usuarios conectados. Em produca o, e dor. Existem 3 abordagens para atualizar codigo "ao vivo":
Abordagem 1: Recompile + UpdRPOData (mais simples)
Voce compila uma User Function direto no AppServer. Apos compile, o codigo novo passa a valer pra novas chamadas — sessoes antigas ainda usam o velho ate desconectarem.
# Via TDS-VSCode ou /advpl-compile
/advpl-compile MinhaFunc.prw
# Apos compile, em uma sessao Protheus:
UpdRPOData() # recarrega metadados — opcional, normalmente automatico
Abordagem 2: Hot swap de RpoCustom (controlado)
Em RPOs separados (cliente.rpo, patches.rpo), voce pode trocar o arquivo do patch sem mexer no tttp.rpo principal.
# 1. Gerar novo patch via TDS-VSCode "Build Patch"
# 2. Copiar pra servidor via SCP
scp patch_v123.rpo root@srv:/protheus_data/apo/
# 3. Atualizar config no appserver.ini (sem restart!)
# Algumas releases aceitam SETAPSCONFIG dinamico:
SetAppConfig("General", "RpoPatches", "patch_v123.rpo")
# 4. Forcar reload
UpdRPOData()
Abordagem 3: Cluster com rolling update (zero downtime real)
Em ambientes com balanceador (HAProxy, Nginx) na frente de 2+ AppServers:
- Drena AppServer A (load balancer para de enviar sessoes novas)
- Espera sessoes ativas terminarem (ou forca apos timeout)
- Atualiza RPO em A + restart
- Volta A no LB, drena B
- Atualiza B + restart
- Zero downtime para o usuario
Pegadinhas de hot patch
- Variaveis Public/Private vivas em sessao antiga continuam com codigo antigo. Resultado: comportamento misto.
- Estrutura de dados mudou (campo adicional na SX3)? Sessoes antigas nao veem. Recomende usuarios reabrir.
- Workers/Jobs rodando carregam codigo na inicializacao. Restart eles separadamente.
- Cache de includes nao recarrega — se mudou .CH, recompile dependentes.
Quando pode hot patch (e quando NAO)
| Tipo de mudanca | Hot patch ok? |
|---|---|
| User Function isolada | ✅ Sim |
| Ponto de Entrada | ✅ Sim (testa em homolog antes) |
| Static Function | ✅ Sim |
| Mudanca em SX3 (campo) | ⚠ Com cuidado — restart usuarios |
| Mudanca em SX2 (tabela) | ❌ Nao — exige restart |
| Mudanca em LIB framework | ❌ Nao — restart obrigatorio |
| Upgrade Protheus completo | ❌ Nao — agendar janela |
Workflow recomendado de deploy em producao
- Build: gerar patch RPO em ambiente de build
- Homolog: subir em homolog, testar com /advpl-validate + /advpl-find-issues
- Producao escalada: subir em horario de menor uso (madrugada)
- Comunicar usuarios: mesmo hot patch, avise se for grande
- Plano de rollback: copia do RPO anterior pronto
- Monitor: assista console.log nos primeiros 30 min
Rollback rapido
# Se algo der errado:
# 1. Restaurar RPO anterior
cp /protheus_backup/patch_anterior.rpo /protheus_data/apo/patch.rpo
# 2. Forcar reload
# (em sessao Protheus admin)
UpdRPOData()
# 3. Se nao resolver, restart agendado
systemctl restart appserver-protheus
Ferramentas que ajudam
- TDS-VSCode: compile remoto direto na producao (com cuidado — autoriza)
- claude-advpl-skill: /advpl-compile faz compile via terminal
- Git tag + CI/CD: vincular versao do RPO ao git, rastreio total