Repository navigation
fix(indy): corrige keep-alive no Linux com Indy antigo e moderno - #624
Merged
regyssilveira merged 1 commit intoOct 29, 2026
Merged
regyssilveira merged 1 commit into
regyssilveira merged 1 commit into
Conversation
This was referenced Oct 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Corrige o
Socket Error #22da issue #623 na configuração de TCP keep-alive dos providers Indy.As implementações de
SetKeepAliveValuesnão têm o mesmo comportamento entre versões do Indy:60000, 100060, 1O Linux recebe
TCP_KEEPIDLEeTCP_KEEPINTVLem segundos. Por isso, trocar os números indiscriminadamente para todo Linux corrigiria o Indy antigo e quebraria o moderno. Também não é seguro inferir o contrato apenas pela versão do Delphi, pois o usuário pode atualizar o Indy separadamente.Solução
THorseIndySocket.ConfigureKeepAlive, usada por Console, Daemon e VCL.SO_KEEPALIVE=1,TCP_KEEPIDLE=60eTCP_KEEPINTVL=1. Isso independe da conversão implementada emSetKeepAliveValues.SetKeepAliveValues(True, 60000, 1000). O mesmo caminho anterior é preservado nas demais plataformas fora de Linux.Regressão reproduzível
Adiciona
tests/indy-keepalive, com dois executáveis, runner PowerShell, linker Linux e Dockerfile:getsockoptdos valores efetivos, configuração repetida e verificação deSO_KEEPALIVE.True, 60000, 1000, delegando a operação ao stack Windows real.VER350para compatibilidade dos defines desse Indy. O controle reproduz erro 22 e a configuração corrigida passa. Esse cenário é de sockets; não é uma compilação produzida pelo Delphi 11/Linux nem um teste HTTP completo com todas as dependências antigas.Resultados locais
Os cenários positivos de HTTP acima totalizam 54 conexões. Os testes Windows ficam com detecção de vazamentos ativada, sem vazamentos inesperados nas execuções finais.
git diff --checkpassou.O Daemon é executado no container como filho direto do PID 1, validando seu listener sem fazer double fork. Não é reivindicada cobertura de daemonização, TLS ou HTTP IPv6. Os testes de socket cobrem IPv6.
Falha preexistente na suíte geral
A suíte geral Delphi 13 foi executada em Tree e Radix: 335 testes por configuração, 334 aprovados, 1 falha, 0 erros. A falha é
Tests.Horse.Core.Middleware.TTestHorseCoreMiddleware.TestMiddlewareExceptionPropagation, que esperaEOSErrorsaindo deExecute, enquanto o fallback atual trata a exceção.Um controle separado, compilado com os fontes do
masteranterior à correção, reproduziu exatamente a mesma falha (fixture com 5 testes, 4 aprovados e 1 falha). Portanto, a suíte geral não é apresentada como integralmente aprovada, e esse comportamento não foi alterado nesta PR. Os relatórios das falhas foram preservados localmente embenchmarks/results.Reprodução
O README inclui o comando para os fontes antigos do Indy e o controle negativo com
-HorseSource. Os testes dependem de uma instalação licenciada do Delphi e foram executados localmente; os jobs públicos de FPC do GitHub Actions não substituem essa validação.Fixes #623