Fixes for previous merges (and additional file added for murmur)
author <brian@233.sub-75-221-160.myvzw.com> <>
Fri, 7 Mar 2008 16:15:01 +0000 (11:15 -0500)
committer <brian@233.sub-75-221-160.myvzw.com> <>
Fri, 7 Mar 2008 16:15:01 +0000 (11:15 -0500)
ChangeLog
THANKS
include/memcached.h
lib/memcached_connect.c
lib/murmur_hash.c [new file with mode: 0644]
src/utilities.c

index ff863160a5da6c7229e83ef424c3ff3e06a14021..9f77a0efdb0c473eb44a3aa395c673c0946c06bd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,17 @@
-0.17
-  * MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT added for connect timeout in
-    non-block mode.
+0.18
   * Fix plus tests for non-zero value objects and flags.
   * MEMCACHED_HASH_MURMUR added for murmur algorithm provided.
   * MEMCACHED_BEHAVIOR_RETRY_TIMEOUT added to keep connecting from looping
     on timeout.
 
+0.17 Wed Feb 27 03:33:29 PST 2008
+  * MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT added for connect timeout in
+    non-block mode.
+  * Incompatible change in memcached_behavior_set() api. We now use a 
+    uint64_t, instead of a pointer.
+  * Fix for storage of values for zero.
+  * memcached_server_cursor() function added to API for cycling through servers.
+
 0.16 Mon Feb 18 00:30:25 PST 2008
   * Work on the UDP protocol
   * Added get_by_key, set_by_key tests for C++ API
diff --git a/THANKS b/THANKS
index 45809cec22285ddc2682a4039559295c7c1885cb..35db53395a547f464936e9f82d03207069a054ab 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -8,3 +8,4 @@ Tim Bunce - Perl Driver work and feedback on API
 Kevin Dalley - Bug Fixes
 Patrick Galbraith - work on C++ interface
 Ross McFarland - Idea for sorting servers.
+Marcelo Fernandez - TCP/IP timeout pieces
index afd43b41ca84146adff3f4887f4b94cc830e4844..3178866d747db5177301c60562773d30c57e433f 100644 (file)
@@ -267,7 +267,7 @@ memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity);
 void memcached_quit(memcached_st *ptr);
 char *memcached_strerror(memcached_st *ptr, memcached_return rc);
 memcached_return memcached_behavior_set(memcached_st *ptr, memcached_behavior flag, void *data);
-unsigned long long memcached_behavior_get(memcached_st *ptr, memcached_behavior flag);
+uint64_t memcached_behavior_get(memcached_st *ptr, memcached_behavior flag);
 
 /* All of the functions for adding data to the server */
 memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length, 
index 4bfc710fa23e9c1543de27c46da52bbfa37d6116..dc86d1e12727567f6b93824429a146dbad66f601 100644 (file)
@@ -1,4 +1,5 @@
 #include "common.h"
+#include <poll.h>
 
 static memcached_return set_hostinfo(memcached_server_st *server)
 {
@@ -136,47 +137,6 @@ test_connect:
     {
       switch (errno) {
       case EINPROGRESS:
-        {
-        struct timeval tm = { ptr->root->connect_timeout, 0 };
-        socklen_t len= sizeof(int);
-        fd_set wset;
-        int error=0, value;
-
-        FD_ZERO(&wset);
-        FD_SET(ptr->fd, &wset);
-
-        select(ptr->fd+1, NULL, &wset, NULL, &tm);
-        if (FD_ISSET(ptr->fd, &wset) != 0)
-        {
-          if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &value, &len) == 0)
-          {
-            if (value)
-            {
-              error= 1;
-            }
-          }
-          else
-          {
-            error= 1;
-          }
-        }
-        else
-        {
-          error= 1;
-        }
-
-        if (error)
-        {
-          ptr->cached_errno= errno;
-          WATCHPOINT_ERRNO(ptr->cached_errno);
-          close(ptr->fd);
-          ptr->fd= -1;
-          return MEMCACHED_ERRNO;
-        }
-
-        break;
-        }
-        /* We are spinning waiting on connect */
       case EALREADY:
       case EINTR:
         goto test_connect;
@@ -237,6 +197,27 @@ test_connect:
           /* We are spinning waiting on connect */
         case EALREADY:
         case EINPROGRESS:
+          {
+            struct pollfd fds[1];
+            int error;
+
+            memset(&fds, 0, sizeof(struct pollfd));
+            fds[0].fd= ptr->fd;
+            fds[0].events= POLLOUT |  POLLERR;
+            error= poll(fds, 1, ptr->root->connect_timeout);
+
+            if (error != 1)
+            {
+              ptr->cached_errno= errno;
+              WATCHPOINT_ERRNO(ptr->cached_errno);
+              close(ptr->fd);
+              ptr->fd= -1;
+              return MEMCACHED_ERRNO;
+            }
+
+            break;
+          }
+        /* We are spinning waiting on connect */
         case EINTR:
           goto test_connect;
         case EISCONN: /* We were spinning waiting on connect */
diff --git a/lib/murmur_hash.c b/lib/murmur_hash.c
new file mode 100644 (file)
index 0000000..abb2ded
--- /dev/null
@@ -0,0 +1,48 @@
+#include "common.h"\r
+\r
+/* \r
+  "Murmur"hash provided by Austin, tanjent@gmail.com\r
+#define MURMUR_POSTMIX\r
+*/\r
+\r
+uint32_t murmur_hash(char *key, size_t length)\r
+{\r
+  const unsigned int m= 0x7fd652ad;\r
+  const int r= 16;\r
+\r
+  uint32_t h= 0xdeadbeef;\r
+\r
+  while(length >= 4)\r
+  {\r
+    h += *(unsigned int *)key;\r
+    h *= m;\r
+    h ^= h >> r;\r
+\r
+    key += 4;\r
+    length -= 4;\r
+  }\r
+\r
+  switch(length)\r
+  {\r
+  case 3:\r
+    h += key[2] << 16;\r
+  case 2:\r
+    h += key[1] << 8;\r
+  case 1:\r
+  default:\r
+    h += key[0];\r
+    h *= m;\r
+    h ^= h >> r;\r
+  };\r
+\r
+#ifdef MURMUR_POSTMIX\r
+\r
+  h *= m;\r
+  h ^= h >> 10;\r
+  h *= m;\r
+  h ^= h >> 17;\r
+\r
+#endif\r
+\r
+  return h;\r
+}\r
index 2094d2186e3a14c3d88ac01236cdf192391ef88d..2a63f9e582a9bf01d9570771c960eaa02344ed0a 100644 (file)
@@ -75,7 +75,7 @@ void help_command(char *command_name, char *description,
 
 void process_hash_option(memcached_st *memc, char *opt_hash)
 {
-  unsigned int set;
+  uint64_t set;
   memcached_return rc;
 
   if (opt_hash == NULL)
@@ -99,7 +99,7 @@ void process_hash_option(memcached_st *memc, char *opt_hash)
     exit(1);
   }
 
-  rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
+  rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
   if (rc != MEMCACHED_SUCCESS)
   {
     fprintf(stderr, "hash: memcache error %s\n", memcached_strerror(memc, rc));