Show
Ignore:
Timestamp:
11/17/08 12:48:21 (8 weeks ago)
Author:
mattn
Message:

merge trunk of libmemcached.

Location:
lang/c/libmemcached-win32
Files:
18 added
54 modified

Legend:

Unmodified
Added
Removed
  • lang/c/libmemcached-win32/example/Makefile.msc

    r20385 r23884  
    1010 
    1111memcached.dll : ../libmemcached-latest/libmemcached/memcached.dll 
    12         cp $< $@ 
     12        copy ..\libmemcached-latest\libmemcached\memcached.dll memcached.dll 
  • lang/c/libmemcached-win32/libmemcached-latest/.hg/branch.cache

    r22355 r23884  
    1 fef841f8411424294314398aa143dd497e68a781 564 
     1fdd68ab3e3f46dbfa971a7ee1f74365494aa2140 575 
    22062ae7f4824e35cd76479ad6abea25a37b2c795b binary 
    33831dd42370aa27144b36041b15e3202c5cab3266 multi 
    4 fef841f8411424294314398aa143dd497e68a781 default 
     4fdd68ab3e3f46dbfa971a7ee1f74365494aa2140 default 
    559cbb58b05ba3f9ba7935dd810f32cb108fd9a51d head 
    66066ab7b9a349b4c2d416760437b370311d8da23a replication 
  • lang/c/libmemcached-win32/libmemcached-latest/ChangeLog

    r22355 r23884  
    22  * Jenkins HASH added. 
    33  * Update of Murmur hash code 
     4  * Support explicit weights (Robey Pointer, Evan Weaver) 
     5  * Bugfix for ketama continuum (Robey Pointer) 
     6  * New behavior MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY (Robey Pointer) 
     7  * Don't ever call stats for weighting servers, because it is unstable. 
    48 
    590.24 Tue Sep 16 02:59:03 PDT 2008 (never released) 
  • lang/c/libmemcached-win32/libmemcached-latest/config/bootstrap

    r19614 r23884  
    2727## We do not currently support glibtoolize 
    2828if test x$LIBTOOLIZE = x; then 
    29 #  if test \! "x`which glibtoolize 2> /dev/null | grep -v '^no'`" = x; then 
    30 #    LIBTOOLIZE=glibtoolize 
    31   if test \! "x`which libtoolize-1.5 2> /dev/null | grep -v '^no'`" = x; then 
     29  if test \! "x`which glibtoolize 2> /dev/null | grep -v '^no'`" = x; then 
     30    LIBTOOLIZE=glibtoolize 
     31  elif test \! "x`which libtoolize-1.5 2> /dev/null | grep -v '^no'`" = x; then 
    3232    LIBTOOLIZE=libtoolize-1.5 
    3333  elif test \! "x`which libtoolize 2> /dev/null | grep -v '^no'`" = x; then 
  • lang/c/libmemcached-win32/libmemcached-latest/configure.ac

    r22355 r23884  
    88#release versioning 
    99MEMCACHED_MAJOR_VERSION=0 
    10 MEMCACHED_MINOR_VERSION=24 
     10MEMCACHED_MINOR_VERSION=25 
    1111MEMCACHED_MICRO_VERSION=0 
    1212 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/common.h

    r20383 r23884  
    1818# ifndef index 
    1919#  define index(x,y) strchr(x,y) 
     20# endif 
     21# ifndef random 
     22#  define random() rand() 
     23# endif 
     24# ifndef srandom 
     25#  define srandom(x) srand(x) 
    2026# endif 
    2127# ifdef _MSC_VER 
     
    114120  /* 11 used for weighted ketama */ 
    115121  MEM_KETAMA_WEIGHTED= (1 << 11), 
    116   MEM_BINARY_PROTOCOL= (1 << 12) 
     122  MEM_BINARY_PROTOCOL= (1 << 12), 
     123  MEM_HASH_WITH_PREFIX_KEY= (1 << 13) 
    117124} memcached_flags; 
    118125 
     
    158165 
    159166void host_reset(memcached_st *ptr, memcached_server_st *host,  
    160                 const char *hostname, unsigned int port, 
     167                const char *hostname, unsigned int port, uint32_t weight, 
    161168                memcached_connection type); 
    162169 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/jenkins_hash.c

    r20386 r23884  
    6666  if ((u.i & 0x3) == 0) { 
    6767    const uint32_t *k = (const uint32_t *)key;         /* read 32-bit chunks */ 
    68     const uint8_t  *k8; 
    6968 
    7069    /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */ 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached.c

    r22355 r23884  
    3333  ptr->distribution= MEMCACHED_DISTRIBUTION_MODULA; 
    3434 
    35   ptr->io_msg_watermark = 500; 
    36   ptr->io_bytes_watermark = 65 * 1024; 
     35  /* TODO, Document why we picked these defaults */ 
     36  ptr->io_msg_watermark= 500; 
     37  ptr->io_bytes_watermark= 65 * 1024; 
    3738 
    3839  return ptr; 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached.h

    r22355 r23884  
    5353}; 
    5454 
    55 #define LIBMEMCACHED_VERSION_STRING "0.24" 
     55#define LIBMEMCACHED_VERSION_STRING "0.25" 
    5656 
    5757struct memcached_stat_st { 
     
    157157memcached_return memcached_server_add(memcached_st *ptr, const char *hostname,  
    158158                                      unsigned int port); 
     159 
     160memcached_return memcached_server_add_udp_with_weight(memcached_st *ptr,  
     161                                                      const char *hostname, 
     162                                                      unsigned int port, 
     163                                                      uint32_t weight); 
     164memcached_return memcached_server_add_unix_socket_with_weight(memcached_st *ptr,  
     165                                                              const char *filename, 
     166                                                              uint32_t weight); 
     167memcached_return memcached_server_add_with_weight(memcached_st *ptr, const char *hostname,  
     168                                                  unsigned int port, 
     169                                                  uint32_t weight); 
    159170void memcached_server_list_free(memcached_server_st *ptr); 
    160171memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list); 
    161172 
    162173memcached_server_st *memcached_server_list_append(memcached_server_st *ptr,  
    163                                              const char *hostname, unsigned int port,  
    164                                              memcached_return *error); 
     174                                                  const char *hostname,  
     175                                                  unsigned int port,  
     176                                                  memcached_return *error); 
     177memcached_server_st *memcached_server_list_append_with_weight(memcached_server_st *ptr,  
     178                                                              const char *hostname,  
     179                                                              unsigned int port,  
     180                                                              uint32_t weight, 
     181                                                              memcached_return *error); 
    165182unsigned int memcached_server_list_count(memcached_server_st *ptr); 
    166183memcached_server_st *memcached_servers_parse(char *server_strings); 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_behavior.c

    r22355 r23884  
    11#include "common.h"  
     2#include <time.h> 
    23#include <sys/types.h> 
    34#ifndef _WIN32 
     
    6162    { 
    6263      ptr->distribution= (memcached_server_distribution)(data); 
     64      if (ptr->distribution == MEMCACHED_DISTRIBUTION_RANDOM) 
     65      { 
     66        srandom(time(NULL)); 
     67      } 
    6368      run_distribution(ptr); 
    6469      break; 
     
    127132  case MEMCACHED_BEHAVIOR_USER_DATA: 
    128133    return MEMCACHED_FAILURE; 
     134  case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: 
     135    set_behavior_flag(ptr, MEM_HASH_WITH_PREFIX_KEY, data); 
     136    break; 
    129137  } 
    130138 
     
    232240  case MEMCACHED_BEHAVIOR_USER_DATA: 
    233241    return MEMCACHED_FAILURE; 
     242  case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: 
     243    temp_flag= MEM_HASH_WITH_PREFIX_KEY; 
     244    break; 
    234245  } 
    235246 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_callback.c

    r19614 r23884  
    2424        size_t key_length= strlen(key); 
    2525 
    26         if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) 
     26        if (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED) 
    2727        { 
    2828          return MEMCACHED_BAD_KEY_PROVIDED; 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_connect.c

    r20379 r23884  
    196196      } 
    197197    } 
    198     /* Old connection junk still is in the structure */ 
    199     WATCHPOINT_ASSERT(ptr->cursor_active == 0); 
    200198 
    201199    if (ptr->sockaddr_inited == MEMCACHED_NOT_ALLOCATED ||  
     
    260258              goto handle_retry; 
    261259            } 
    262             else if (error != 1 || fds[0].revents & POLLERR) 
     260            else if (error != 1 && fds[0].revents & POLLERR) 
    263261            { 
    264262              ptr->cached_errno= errno; 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_constants.h

    r22355 r23884  
    2020#define MEMCACHED_MAX_HOST_LENGTH 64 
    2121#define MEMCACHED_MAX_HOST_SORT_LENGTH 86 /* Used for Ketama */ 
    22 #define MEMCACHED_POINTS_PER_SERVER 100  
     22#define MEMCACHED_POINTS_PER_SERVER 100 
     23#define MEMCACHED_POINTS_PER_SERVER_KETAMA 160 
    2324#define MEMCACHED_CONTINUUM_SIZE MEMCACHED_POINTS_PER_SERVER*100 /* This would then set max hosts to 100 */  
    2425#define MEMCACHED_STRIDE 4 
    2526#define MEMCACHED_DEFAULT_TIMEOUT 1000 
    2627#define MEMCACHED_CONTINUUM_ADDITION 10 /* How many extra slots we should build for in the continuum */ 
    27 #define MEMCACHED_PREFIX_KEY_MAX_SIZE 12 
     28#define MEMCACHED_PREFIX_KEY_MAX_SIZE 128 
    2829 
    2930typedef enum { 
     
    6768  MEMCACHED_DISTRIBUTION_MODULA, 
    6869  MEMCACHED_DISTRIBUTION_CONSISTENT, 
    69   MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA 
     70  MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA, 
     71  MEMCACHED_DISTRIBUTION_RANDOM 
    7072} memcached_server_distribution; 
    7173 
     
    9496  MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 
    9597  MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK, 
    96   MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK 
     98  MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK, 
     99  MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY 
    97100} memcached_behavior; 
    98101 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_do.c

    r19614 r23884  
    1111 
    1212  if ((rc= memcached_connect(ptr)) != MEMCACHED_SUCCESS) 
     13  { 
     14    WATCHPOINT_ERROR(rc); 
    1315    return rc; 
     16  } 
    1417 
    1518  sent_length= memcached_io_write(ptr, command, command_length, with_flush); 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_hash.c

    r20383 r23884  
    122122      hash= hash; 
    123123      begin= left= ptr->continuum; 
    124       end= right= ptr->continuum + (num - 1); 
    125  
    126       while (1) 
    127       { 
    128         memcached_continuum_item_st *rmiddle; 
    129  
    130         middle = left + (right - left) / 2; 
    131  
    132         if (middle==end) 
    133           return begin->index; 
    134  
    135         if (middle==begin) 
    136           return end->index; 
    137  
    138         rmiddle = middle+1; 
    139  
    140         if (hash < rmiddle->value && hash >= middle->value) 
    141           return middle->index; 
    142  
     124      end= right= ptr->continuum + num; 
     125 
     126      while (left < right) 
     127      { 
     128        middle= left + (right - left) / 2; 
    143129        if (middle->value < hash) 
    144           left = middle + 1; 
    145         else if (middle->value > hash) 
    146           right = middle - 1; 
    147  
    148         if (left>right) 
    149           return left->index; 
    150       } 
     130          left= middle + 1; 
     131        else 
     132          right= middle; 
     133      } 
     134      if (right > end) 
     135        right= begin; 
     136      return right->index; 
    151137    }  
    152138    break; 
    153139  case MEMCACHED_DISTRIBUTION_MODULA: 
    154140    return hash % ptr->number_of_hosts; 
     141  case MEMCACHED_DISTRIBUTION_RANDOM: 
     142    return random() % ptr->number_of_hosts; 
    155143  default: 
    156144    WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */ 
     
    175163    return 0; 
    176164 
    177   hash= generate_hash(ptr, key, key_length); 
     165  if (ptr->flags & MEM_HASH_WITH_PREFIX_KEY) 
     166  { 
     167    int temp_len= ptr->prefix_key_length + key_length; 
     168    char *temp= (char *)malloc(temp_len); 
     169    strncpy(temp, ptr->prefix_key, ptr->prefix_key_length); 
     170    strncpy(temp + ptr->prefix_key_length, key, key_length); 
     171    hash= generate_hash(ptr, temp, temp_len); 
     172    free(temp); 
     173  } 
     174  else 
     175  { 
     176    hash= generate_hash(ptr, key, key_length); 
     177  } 
    178178 
    179179  WATCHPOINT_ASSERT(hash); 
  • lang/c/libmemcached-win32/libmemcached-latest/libmemcached/memcached_hosts.c

    r20383 r23884  
    55static memcached_return server_add(memcached_st *ptr, const char *hostname,  
    66                                   unsigned int port, 
     7                                   uint32_t weight, 
    78                                   memcached_connection type); 
    89memcached_return update_continuum(memcached_st *ptr); 
     
    4546      sort_hosts(ptr); 
    4647    break; 
     48  case MEMCACHED_DISTRIBUTION_RANDOM: 
     49    break; 
    4750  default: 
    4851    WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */ 
     
    5356 
    5457void host_reset(memcached_st *ptr, memcached_server_st *host,  
    55                 const char *hostname, unsigned int port, 
     58                const char *hostname, unsigned int port, uint32_t weight, 
    5659                memcached_connection type) 
    5760{ 
     
    6063  host->root= ptr ? ptr : NULL; 
    6164  host->port= port; 
     65  host->weight= weight; 
    6266  host->fd= -1; 
    6367  host->type= type; 
     
    8690  else 
    8791    free(servers); 
     92} 
     93 
     94static uint32_t ketama_server_hash(const char *key, unsigned int key_length, int alignment) 
     95{ 
     96  unsigned char results[16]; 
     97   
     98  md5_signature((unsigned char*)key, key_length, results); 
     99  return ((uint32_t) (results[3 + alignment * 4] & 0xFF) << 24) 
     100    | ((uint32_t) (results[2 + alignment * 4] & 0xFF) << 16) 
     101    | ((uint32_t) (results[1 + alignment * 4] & 0xFF) << 8) 
     102    | (results[0 + alignment * 4] & 0xFF); 
    88103} 
    89104 
     
    112127  uint32_t pointer_counter= 0; 
    113128  uint32_t pointer_per_server= MEMCACHED_POINTS_PER_SERVER; 
    114   memcached_return rc; 
    115   uint64_t total_mem_bytes= 0; 
    116   memcached_stat_st *stat_p= NULL; 
     129  uint32_t pointer_per_hash= 1; 
     130  uint64_t total_weight= 0; 
    117131  uint32_t is_ketama_weighted= 0; 
     132  uint32_t points_per_server= 0; 
     133 
     134  is_ketama_weighted= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED); 
     135  points_per_server= is_ketama_weighted ? MEMCACHED_POINTS_PER_SERVER_KETAMA : MEMCACHED_POINTS_PER_SERVER; 
    118136 
    119137  if (ptr->number_of_hosts > ptr->continuum_count) 
     
    122140 
    123141    if (ptr->call_realloc) 
    124       new_ptr= (memcached_continuum_item_st *)ptr->call_realloc(ptr, ptr->continuum, sizeof(memcached_continuum_item_st) * (ptr->number_of_hosts + MEMCACHED_CONTINUUM_ADDITION) * MEMCACHED_POINTS_PER_SERVER); 
     142      new_ptr= (memcached_continuum_item_st *)ptr->call_realloc(ptr, ptr->continuum, sizeof(memcached_continuum_item_st) * (ptr->number_of_hosts + MEMCACHED_CONTINUUM_ADDITION) * points_per_server); 
    125143    else 
    126       new_ptr= (memcached_continuum_item_st *)realloc(ptr->continuum, sizeof(memcached_continuum_item_st) * (ptr->number_of_hosts + MEMCACHED_CONTINUUM_ADDITION) * MEMCACHED_POINTS_PER_SERVER); 
     144      new_ptr= (memcached_continuum_item_st *)realloc(ptr->continuum, sizeof(memcached_continuum_item_st) * (ptr->number_of_hosts + MEMCACHED_CONTINUUM_ADDITION) * points_per_server); 
    127145 
    128146    if (new_ptr == 0) 
     
    135153  list = ptr->hosts; 
    136154 
    137   is_ketama_weighted= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED); 
    138   if(is_ketama_weighted)  
    139   { 
    140     stat_p = memcached_stat(ptr, NULL, &rc); 
     155  if (is_ketama_weighted)  
     156