A mensagem de erro significa (referências de números de linha referem-se ao verniz 2.1.3):
Ao buscar um cabeçalho [bin / varnishd / cache_fetch.c: 399], ou:
a) ocorreu um estouro [bin / varnishd / cache_httpconn.c: 170]
ou
b) ocorreu um erro ao chamar read () [bin / varnishd / cache_httpconn.c: 175]
O número no final é o valor de errno, então como é 0 (sem erro) eu assumirei que a opção a) ocorreu porque read()
não deve retornar um número negativo sem configurar errno.
O estouro é detectado com o seguinte código [bin / varnishd / cache_httpconn.c: 167] retornando um resultado negativo:
i = (htc->ws->r - htc->rxbuf.e) - 1; /* space for NUL */
htc->ws
é uma struct ws
[bin / varnishd / cache.h: 126] que é uma "estrutura da área de trabalho" O membro r é o comprimento reservado dessa área de trabalho. htc->rxbuf
refere-se a struct txt
[bin / varnishd / cache.h: 109], mas não há comentários descrevendo a que os membros (b & e) se referem. Começando e terminando talvez?
Eu não sei como espaços de trabalho são redimensionados (ou mesmo se eles são), mas - e eu estou realmente em adivinhando território aqui - eu diria que algumas possíveis causas do problema são:
- Um número muito grande de cabeçalhos
- cabeçalhos muito longos
- Um erro em como o Varnish redimensiona os espaços de trabalho (se isso acontecer)
Pode ser útil tentar encontrar o ponto no qual o erro pode ser forçado a ocorrer, pesquisando no espaço de:
- Comprimentos do cabeçalho
- Números de cabeçalhos
e veja se você pode reproduzir o problema de maneira confiável.
Você pode conseguir contornar o problema aumentando a opção http_headers
runtime. (Se você estiver executando o < 2.1, acho que é uma opção de tempo de compilação ou de configuração)