Le message d'erreur signifie (les références aux numéros de lignes se réfèrent à varnish 2.1.3) :
Pendant la récupération d'un en-tête [bin/varnishd/cache_fetch.c:399], soit :
a) un dépassement de capacité s'est produit [bin/varnishd/cache_httpconn.c:170].
o
b) une erreur s'est produite lors de l'appel de read() [bin/varnishd/cache_httpconn.c:175].
Le nombre à la fin est la valeur de errno, donc puisqu'il est 0 (pas d'erreur) je devrais supposez que l'option a) s'est produite depuis read()
ne devrait pas retourner un nombre négatif sans mettre errno.
Le dépassement est détecté avec le code suivant [bin/varnishd/cache_httpconn.c:167] qui renvoie un résultat négatif :
i = (htc->ws->r - htc->rxbuf.e) - 1; /* space for NUL */
htc->ws
es un struct ws
[bin/varnishd/cache.h:126] qui est une "structure d'espace de travail" Le membre r est la longueur réservée de cet espace de travail. htc->rxbuf
fait référence à un struct txt
[bin/varnishd/cache.h:109] mais il n'y a pas de commentaire décrivant ce à quoi les membres (b & e) font référence. Le début et la fin peut-être ?
Je ne sais pas comment les espaces de travail sont redimensionnés (ou même s'ils le sont) mais - et je suis vraiment en territoire de conjecture ici - je supposerais que les causes possibles du problème sont les suivantes :
- Un très grand nombre d'en-têtes
- En-têtes très longs
- Un bug dans la façon dont Varnish redimensionne les espaces de travail (s'il le fait)
Il pourrait être utile d'essayer de trouver le point où l'erreur peut être forcée à se produire en cherchant dans l'espace de :
- Longueurs d'en-tête
- Nombre d'en-têtes
et voyez si vous pouvez reproduire le problème de manière fiable.
Vous pouvez contourner le problème en augmentant le nombre d'heures d'utilisation de l'appareil. http_headers
option d'exécution. (Si vous utilisez < 2.1, je pense que c'est une option de compilation ou de configuration).