nginx-0.5.34

Igor Sysoev is at rambler-co.ru
Thu Dec 13 16:02:19 MSK 2007


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
-------------- next part --------------
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;


More information about the nginx-ru mailing list