ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: memcached_hash + nginx 0.8.x



Hello!

On Fri, May 13, 2011 at 03:56:35PM +0200, Sergey Bondari wrote:

> Добрый день,
> 
>        безуспешно пытаюсь собрать nginx c патчами для директивы
>        memcached_hash на ветке 0.8.х
> 
>        Я правильно понял что это невозможно и что оно собирается
>        только из GIT nginx-patched 0.6 & 0.7 ?

Прилагающийся патчик на memcached hash 0.4 был сделан во времена 
0.8.50.  Для 0.8.* должен работать, для 1.0.* потребуются 
небольшие изменения в связи с появлением ngx_memmove().

Из исходного комплекта патчей memcached hash накладывать только 
тот, что про upstream name.

Maxim Dounin
Cleanup for recent versions and reduce number of required patches.

- Type ngx_peer_addr_t was renamed to ngx_addr_t.
- Don't depend on ngx_memmove() patch, define it inline.
- Don't require $memcached_namespace variable to be defined.
- Check if key length still positive after extracting namespace to
  avoid SIGSEGV without memcached_namespace patch and with namespace
  set.

The only patch currently required is one for upstream name.

--- 
../ngx_http_upstream_memcached_hash_module-0.04/ngx_http_upstream_memcached_hash_module.c
+++ 
../ngx_http_upstream_memcached_hash_module-0.04/ngx_http_upstream_memcached_hash_module.c
@@ -17,6 +17,9 @@
 #define CONTINUUM_MAX_POINT  0xffffffffU
 
 
+#define ngx_memmove(dst, src, n)  (void) memmove(dst, src, n)
+
+
 static ngx_str_t memcached_ns = ngx_string("memcached_namespace");
 
 
@@ -102,7 +105,7 @@ memcached_hash_find_peer(struct memcache
 {
   struct memcached_hash *memd = find_ctx->memd;
   u_char *key;
-  size_t len;
+  ssize_t len;
   unsigned int point, bucket, index;
 
   if (memd->peer_count == 1)
@@ -128,6 +131,15 @@ memcached_hash_find_peer(struct memcache
         
       len = request_bufs->buf->last - key - (sizeof("\r\n") - 1);
 
+      if (len < 0)
+        {
+          ngx_log_error(NGX_LOG_ALERT, find_ctx->request->connection->log, 0,
+                        "memcached hash negative key length");
+
+          index = 0;
+          goto out;
+        }
+
       point = ngx_crc32_long(key, len);
 
       if (memd->ketama_points == 0)
@@ -149,6 +161,8 @@ memcached_hash_find_peer(struct memcache
       index = memd->buckets[bucket].index;
     }
 
+out:
+
   find_ctx->peer = &memd->peers[index];
 
   return index;
@@ -161,7 +175,7 @@ memcached_hash_get_peer(ngx_peer_connect
 {
   struct memcached_hash_find_ctx *find_ctx = data;
   struct memcached_hash_peer *peer = find_ctx->peer;
-  ngx_peer_addr_t *addr;
+  ngx_addr_t *addr;
 
   if (! peer)
     {
@@ -445,12 +459,22 @@ memcached_init_hash(ngx_conf_t *cf, ngx_
 }
 
 
+static ngx_int_t
+memcached_hash_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,
+    uintptr_t data)
+{
+  v->not_found = 1;
+  return NGX_OK;
+}
+
+
 static
 char *
 memcached_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
   ngx_str_t *value = cf->args->elts;
   ngx_http_upstream_srv_conf_t *uscf;
+  ngx_http_variable_t *v;
   struct memcached_hash *memd;
   int ketama_points, scale;
   unsigned int i;
@@ -497,6 +521,15 @@ memcached_hash(ngx_conf_t *cf, ngx_comma
       return NGX_CONF_ERROR;
   }
 
+  v = ngx_http_add_variable(cf, &memcached_ns, NGX_HTTP_VAR_CHANGEABLE);
+  if (v == NULL) {
+      return NGX_CONF_ERROR;
+  }
+
+  if (v->get_handler == NULL) {
+      v->get_handler = memcached_hash_var;
+  }
+
   uscf->peer.data = memd;
 
   uscf->peer.init_upstream = memcached_init_hash;
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.