Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: nginx-0.5.34
On Thu, Dec 13, 2007 at 03:53:42PM +0300, Andrey N. Oktyabrski wrote:
> Igor Sysoev wrote:
> >>> *) Исправление: рабочий процесс мог зациклиться при использовании
> >>> memcached.
> >>Можно об этом чуть подробнее? Дело в том, что у нас приблезно похожая
> >>проблема, никак не можем поймать ошибку. Подняли memcached до 1.2.2 -
> >>вроде меньше стало зацикливаний (практически совсем пропали), но знать
> >>причину всё же хотелось бы, а то неуютно как-то...
> >nginx неверно определял конец данных memcached при определённых условиях.
> >У Монашёва после патча стало зависать значительно реже, но вроде пару
> >раз было. Сейчас он собрал с отладкой и ждёт зависание.
> Угу, спасибо, попробую помедитировать над diff 0.5.33->0.5.34,
> сопоставить со своим кодом - может осенит...
Не надо медитировать: патч.
--
Игорь Сысоев
http://sysoev.ru
Index: src/http/modules/ngx_http_memcached_module.c
===================================================================
--- src/http/modules/ngx_http_memcached_module.c (revision 873)
+++ src/http/modules/ngx_http_memcached_module.c (revision 874)
@@ -426,15 +426,15 @@
if (ngx_strncmp(b->last,
ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,
- bytes)
+ ctx->rest)
!= 0)
{
ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
"memcached sent invalid trailer");
}
- u->length -= bytes;
- ctx->rest -= bytes;
+ u->length = 0;
+ ctx->rest = 0;
return NGX_OK;
}
@@ -453,7 +453,8 @@
*ll = cl;
- cl->buf->pos = b->last;
+ last = b->last;
+ cl->buf->pos = last;
b->last += bytes;
cl->buf->last = b->last;
@@ -461,20 +462,19 @@
"memcached filter bytes:%z size:%z length:%z rest:%z",
bytes, b->last - b->pos, u->length, ctx->rest);
- if (b->last - b->pos <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {
+ if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {
u->length -= bytes;
return NGX_OK;
}
+ last += u->length - NGX_HTTP_MEMCACHED_END;
- last = b->pos + u->length - NGX_HTTP_MEMCACHED_END;
-
if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) {
ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
"memcached sent invalid trailer");
}
- ctx->rest = u->length - (b->last - b->pos);
+ ctx->rest -= b->last - last;
b->last = last;
cl->buf->last = last;
u->length = ctx->rest;
|