Quais garantias existem para liberar os buffers de envio TCP, se houver, quando osubsistema de freezercongela um cgroup?
Considere o seguinte cenário: O Servidor A, que roda em um cgroup, envia dados para o Servidor B via TCP. O soquete TCP está configurado para usar o algoritmo do Naggle (a TCP_NODELAY
opção não está definida). Portanto, send
a transferência de dados pelo soquete não bloqueia o ACK do Servidor B, mas retorna após os dados a serem enviados terem sido copiados para o buffer de envio TCP. Depois disso, mas antes dos dados serem enviados ao Servidor B, o cgroup é congelado.
O que acontece com os dados no buffer de envio TCP?
- A operação de congelamento aguardará até que todos os dados no buffer sejam reconhecidos pelo Servidor B? E se o buffer de recebimento do Servidor B estiver cheio? O congelamento aguardará indefinidamente pela confirmação do Servidor B?
- O congelamento não esperará pelo ACK do Servidor B e continuará a enviar os dados após o cgroup ter sido descongelado? Se o atraso entre o congelamento e o descongelamento for longo o suficiente para que o Servidor B feche a conexão TCP, os dados no buffer serão perdidos.
Links para especificações e garantias em torno desse comportamento são apreciados. Mas talvez não haja garantias, então confiar em qualquer um dos comportamentos seria frágil?
O pano de fundo da questão é que estou me perguntando o quão cuidadoso deve ser ao enviar dados via TCP no AWS Lambda (minha suposição é que o AWS Lambda usa cgroups para congelar/descongelar após/antes de uma invocação do Lambda ser tratada). É suficiente liberar buffers de aplicativos para o buffer de envio TCP/soquete TCP? Ou é preciso ter certeza de que o Servidor B recebeu os dados na camada de aplicação, por exemplo, usando HTTP e aguardando a resposta HTTP do servidor?