Updating to remove memory leak in functions.c (aka test cases).
authorBrian Aker <brian@tangent.org>
Wed, 5 Dec 2007 22:46:48 +0000 (14:46 -0800)
committerBrian Aker <brian@tangent.org>
Wed, 5 Dec 2007 22:46:48 +0000 (14:46 -0800)
18 files changed:
ChangeLog
docs/Makefile.am
docs/libmemcached.pod
docs/memcached_behavior.pod
docs/memcached_get.pod
docs/memcached_set.pod
include/memcached.h
lib/memcached.c
lib/memcached_get.c
lib/memcached_hash.c
lib/memcached_storage.c
src/memslap.c
support/libmemcached.spec.in
tests/Makefile.am
tests/function.c
tests/output.res
tests/t/memslap.test
tests/test.c

index cb53ed899e4c3ff1a1da7370ed10dd079afc3860..79cb10c7cfded8da24d39b60c8d541bd584aff5e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,9 @@
   * Change in value fetch, MEMCACHED_END is now returned when keys are no
     longer in the pipe.
   * Fixed bug where key could be out of range of characters
+  * Added _by_key() methods to allow partitioning of values to particular
+    servers.
+  * MEMCACHED_DEFAILT_TIMEOUT is now set to 100 microseconds.
 
 0.11 Mon Nov 26 01:05:52 PST 2007
   * Added option to memcache_behavior_set() so that poll() can be timed out.
index 767065d464f4e3cb78921d9104d1ac4842daeb02..b19cc769e6ee9c6327cc5f69a4308602ef386a84 100644 (file)
@@ -33,10 +33,13 @@ man_MANS = libmemcached.3\
        memslap.1\\r
        memstat.1\\r
        memcached_add.3\\r
+       memcached_add_by_key.3\\r
        memcached_append.3\\r
+       memcached_append_by_key.3\\r
        memcached_behavior_get.3\\r
        memcached_behavior_set.3\\r
        memcached_cas.3\\r
+       memcached_cas_by_key.3\\r
        memcached_clone.3\\r
        memcached_create.3\\r
        memcached_decrement.3\\r
@@ -45,10 +48,14 @@ man_MANS = libmemcached.3\
        memcached_fetch_result.3\\r
        memcached_free.3\\r
        memcached_get.3\\r
+       memcached_get_by_key.3\\r
        memcached_increment.3\\r
        memcached_mget.3\\r
+       memcached_mget_by_key.3\\r
        memcached_prepend.3\\r
+       memcached_prepend_by_key.3\\r
        memcached_replace.3\\r
+       memcached_replace_by_key.3\\r
        memcached_server_add.3\\r
        memcached_server_count.3\\r
        memcached_server_list.3\\r
@@ -58,6 +65,7 @@ man_MANS = libmemcached.3\
        memcached_server_push.3\\r
        memcached_servers_parse.3\\r
        memcached_set.3\\r
+       memcached_set_by_key.3\\r
        memcached_stat.3\\r
        memcached_stat_get_keys.3\\r
        memcached_stat_get_value.3\\r
@@ -84,21 +92,39 @@ memcached_clone.3: memcached_create.pod
 memcached_set.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_set.3\r
 \r
+memcached_set_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_set_by_key.3\r
+\r
 memcached_cas.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_cas.3\r
 \r
+memcached_cas_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_cas_by_key.3\r
+\r
 memcached_replace.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_replace.3\r
 \r
+memcached_replace_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_replace_by_key.3\r
+\r
 memcached_add.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_add.3\r
 \r
+memcached_add_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_add_by_key.3\r
+\r
 memcached_prepend.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_prepend.3\r
 \r
+memcached_prepend_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_prepend_by_key.3\r
+\r
 memcached_append.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_append.3\r
 \r
+memcached_append_by_key.3: memcached_set.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_append_by_key.3\r
+\r
 memcached_delete.3: memcached_delete.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_delete.pod > memcached_delete.3\r
 \r
@@ -114,12 +140,18 @@ memcached_flush.3: memcached_flush.pod
 memcached_get.3: memcached_get.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_get.3\r
 \r
+memcached_get_by_key.3: memcached_get.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_get_by_key.3\r
+\r
 memcached_fetch_result.3: memcached_get.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_fetch_result.3\r
 \r
 memcached_mget.3: memcached_get.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_mget.3\r
 \r
+memcached_mget_by_key.3: memcached_get.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_mget_by_key.3\r
+\r
 memcached_fetch.3: memcached_get.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_fetch.3\r
 \r
index 510cd1e7200f58a274cefcd975fb6574bf5c51ad..1eaef0ae48d062355358fe5716ee8fc7a7e11177 100755 (executable)
@@ -20,7 +20,8 @@ B<libmemcached> is a small, thread-safe client library for the
 memcached protocol. The code has all been written with an eye to allow
 for both web and embedded usage. It handles the work behind routing
 particular keys to specific servers that you specify (and values are
-matched based on server order as supplied by you).
+matched based on server order as supplied by you). It implements both
+a modula and consistent method of object distribution.
 
 The aim is to support multiple routing and hashing methods. Currently only
 two hashing methods are supported, a quick built-in routine, and MD5. For
@@ -35,6 +36,9 @@ recommended that you operate directly against the structure.
 Nearly all functions return a C<memcached_return> value.
 This value can be translated to a printable string with memcached_strerr(3).
 
+Partitioning based on keys is supported in the library. Using the key partioning 
+functions it is possible to group sets of object onto servers.
+
 C<memcached_st> structures are thread-safe, but each thread must
 contain its own structure (that is, if you want to share these among
 threads you must provide your own locking). No global variables are
@@ -70,6 +74,6 @@ Brian Aker, E<lt>brian@tangent.orgE<gt>
 
 =head1 SEE ALSO
 
-memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3)  memcached_result_free(3)  memcached_result_key_value(3)  memcached_result_key_length(3)  memcached_result_value(3)  memcached_result_length(3)  memcached_result_flags(3)  memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1)
+memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3)  memcached_result_free(3)  memcached_result_key_value(3)  memcached_result_key_length(3)  memcached_result_value(3)  memcached_result_length(3)  memcached_result_flags(3)  memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1) memcached_get_by_key() memcached_mget_by_key()
 =cut
 
index e654778573369a336d19d71c02f2485e18edbdd3..b1545534e70e9f07c6251b51ca007263185c009f 100755 (executable)
@@ -54,7 +54,7 @@ Makes the default hashing algorithm for keys use MD5. The value can be set to ei
 =item MEMCACHED_BEHAVIOR_DISTRIBUTION
 
 Using this you can enable different means of distributing values to servers.
-The default method is MEMCACHED_DISTRIBUTION_MODULO. You can enable
+The default method is MEMCACHED_DISTRIBUTION_MODULA. You can enable
 consistent hashing by setting MEMCACHED_DISTRIBUTION_CONSISTENT. 
 Consistent hashing delivers better distribution and allows servers to be 
 added to the cluster with minimal cache losses. 
index 6de4b5eb4af15ed0402da032d13a2b218401b496..111a3b614d381234ea0527aefb4da701d7222433 100755 (executable)
@@ -25,6 +25,19 @@ C Client Library for memcached (libmemcached, -lmemcached)
   memcached_mget (memcached_st *ptr, 
                   char **keys, size_t *key_length, 
                   unsigned int number_of_keys);
+  char *
+  memcached_get_by_key(memcached_st *ptr, 
+                       char *master_key, size_t master_key_length, 
+                       char *key, size_t key_length, 
+                       size_t *value_length, 
+                       uint16_t *flags,
+                       memcached_return *error);
+
+  memcached_return 
+  memcached_mget_by_key(memcached_st *ptr, 
+                        char *master_key, size_t master_key_length,
+                        char **keys, size_t *key_length, 
+                        unsigned int number_of_keys);
 
   char *memcached_fetch (memcached_st *ptr,
                          char *key, size_t *key_length, 
@@ -67,6 +80,11 @@ to the server. For more information please refer to the memcached_result_st(3)
 help. This function will dynamically allocate a result structure for you
 if you do not pass one to the function.
 
+memcached_get_by_key() and memcached_mget_by_key() behave in a similar nature
+as memcached_get() and memcached_mget(). The difference is that they take
+a master key that is used for determining which server an object was stored
+if key partitioning was used for storage.
+
 =head1 RETURN
 
 All objects returned must be freed by the calling application.
index 0578d17f3b372c39db2e3a1f39e36b1efb758dac..8db5b06d8ff2b3750af7806a08a11bdcefa2e184 100755 (executable)
@@ -52,6 +52,55 @@ C Client Library for memcached (libmemcached, -lmemcached)
                   uint16_t flags,
                   uint64_t cas);
 
+  memcached_return 
+    memcached_set_by_key(memcached_st *ptr, 
+                         char *master_key, size_t master_key_length, 
+                         char *key, size_t key_length, 
+                         char *value, size_t value_length, 
+                         time_t expiration,
+                         uint16_t flags);
+
+  memcached_return 
+    memcached_add_by_key(memcached_st *ptr, 
+                         char *master_key, size_t master_key_length,
+                         char *key, size_t key_length,
+                         char *value, size_t value_length, 
+                         time_t expiration,
+                         uint16_t flags);
+
+  memcached_return 
+    memcached_replace_by_key(memcached_st *ptr, 
+                             char *master_key, size_t master_key_length,
+                             char *key, size_t key_length,
+                             char *value, size_t value_length, 
+                             time_t expiration,
+                             uint16_t flags);
+
+  memcached_return 
+    memcached_prepend_by_key(memcached_st *ptr, 
+                             char *master_key, size_t master_key_length,
+                             char *key, size_t key_length,
+                             char *value, size_t value_length, 
+                             time_t expiration,
+                             uint16_t flags);
+
+  memcached_return 
+    memcached_append_by_key(memcached_st *ptr, 
+                            char *master_key, size_t master_key_length,
+                            char *key, size_t key_length,
+                            char *value, size_t value_length, 
+                            time_t expiration,
+                            uint16_t flags);
+
+  memcached_return 
+    memcached_cas_by_key(memcached_st *ptr, 
+                         char *master_key, size_t master_key_length,
+                         char *key, size_t key_length,
+                         char *value, size_t value_length, 
+                         time_t expiration,
+                         uint16_t flags,
+                         uint64_t cas);
+
 =head1 DESCRIPTION
 
 memcached_set(), memcached_add(), and memcached_replace() are all used to
@@ -85,6 +134,12 @@ that this note was written cas is still buggy in memached. Turning on support
 for it in libmemcached(3) is optional. Please see memcached_set() for 
 information on how to do this.
 
+memcached_set_by_key(), memcached_add_by_key(), memcached_replace_by_key(), 
+memcached_prepend_by_key(), memcached_append_by_key_by_key(), 
+memcached_cas_by_key() methods all behave in a similar method as the non key 
+methods. The difference is that they use their master_key parameter to map
+objects to particular servers.
+
 If you are looking for performance, memcached_set() with non-blocking IO is 
 the fastest way to store data on the server.
 
index c4871027d3ad596d492697ae8ad76a67ba54bbab..175c93c3529c5e17347d0009ea739dcdf55ac9b2 100644 (file)
@@ -35,7 +35,7 @@ typedef struct memcached_server_st memcached_server_st;
 #define MEMCACHED_MAX_HOST_LENGTH 64
 #define MEMCACHED_WHEEL_SIZE 1024
 #define MEMCACHED_STRIDE 4
-#define MEMCACHED_DEFAILT_TIMEOUT 100
+#define MEMCACHED_DEFAULT_TIMEOUT 100
 
 typedef enum {
   MEMCACHED_SUCCESS,
@@ -72,7 +72,7 @@ typedef enum {
 } memcached_return;
 
 typedef enum {
-  MEMCACHED_DISTRIBUTION_MODULO,
+  MEMCACHED_DISTRIBUTION_MODULA,
   MEMCACHED_DISTRIBUTION_CONSISTENT,
 } memcached_server_distribution;
 
@@ -299,6 +299,61 @@ char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *stat,
 char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *stat, 
                                 memcached_return *error);
 
+char *memcached_get_by_key(memcached_st *ptr, 
+                           char *master_key, size_t master_key_length, 
+                           char *key, size_t key_length, 
+                           size_t *value_length, 
+                           uint16_t *flags,
+                           memcached_return *error);
+
+memcached_return memcached_mget_by_key(memcached_st *ptr, 
+                                       char *master_key, size_t master_key_length,
+                                       char **keys, size_t *key_length, 
+                                       unsigned int number_of_keys);
+
+memcached_return memcached_set_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length, 
+                                      char *key, size_t key_length, 
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags);
+
+memcached_return memcached_add_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags);
+
+memcached_return memcached_replace_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags);
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags);
+
+memcached_return memcached_append_by_key(memcached_st *ptr, 
+                                         char *master_key, size_t master_key_length,
+                                         char *key, size_t key_length,
+                                         char *value, size_t value_length, 
+                                         time_t expiration,
+                                         uint16_t flags);
+
+memcached_return memcached_cas_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags,
+                                      uint64_t cas);
+
 /* Result Struct */
 void memcached_result_free(memcached_result_st *result);
 memcached_result_st *memcached_result_create(memcached_st *ptr, 
index 9ee49d665f38338e0024301f3a366f82e74247df..30099c39ff7a2f643f2edd9caaaddb0ee5b0d979 100644 (file)
@@ -22,8 +22,8 @@ memcached_st *memcached_create(memcached_st *ptr)
   }
   string_ptr= memcached_string_create(ptr, &ptr->result_buffer, 0);
   WATCHPOINT_ASSERT(string_ptr);
-  ptr->poll_timeout= MEMCACHED_DEFAILT_TIMEOUT;
-  ptr->distribution= MEMCACHED_DISTRIBUTION_MODULO;
+  ptr->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
+  ptr->distribution= MEMCACHED_DISTRIBUTION_MODULA;
 
   return ptr;
 }
index 598767f83c45f928bdf9b2d0de0edb4727fc4b81..087e4960f33355e3bf49ae93d2d85f6839c7355f 100644 (file)
@@ -8,11 +8,25 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
                     size_t *value_length, 
                     uint16_t *flags,
                     memcached_return *error)
+{
+  return memcached_get_by_key(ptr, NULL, 0, key, key_length, value_length, 
+                              flags, error);
+}
+
+char *memcached_get_by_key(memcached_st *ptr, 
+                           char *master_key, size_t master_key_length, 
+                           char *key, size_t key_length, 
+                           size_t *value_length, 
+                           uint16_t *flags,
+                           memcached_return *error)
 {
   char *value;
 
   /* Request the key */
-  *error= memcached_mget(ptr, &key, &key_length, 1);
+  *error= memcached_mget_by_key(ptr, 
+                                master_key, 
+                                master_key_length, 
+                                &key, &key_length, 1);
 
   value= memcached_fetch(ptr, NULL, NULL, 
                          value_length, flags, error);
@@ -32,11 +46,20 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
 memcached_return memcached_mget(memcached_st *ptr, 
                                 char **keys, size_t *key_length, 
                                 unsigned int number_of_keys)
+{
+  return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
+}
+
+memcached_return memcached_mget_by_key(memcached_st *ptr, 
+                                       char *master_key, size_t master_key_length,
+                                       char **keys, size_t *key_length, 
+                                       unsigned int number_of_keys)
 {
   unsigned int x;
   memcached_return rc= MEMCACHED_NOTFOUND;
   char *get_command= "get ";
-  uint8_t get_command_length= 4
+  uint8_t get_command_length= 4;
+  unsigned int master_server_key= 0;
 
   LIBMEMCACHED_MEMCACHED_MGET_START();
   ptr->cursor_server= 0;
@@ -55,6 +78,9 @@ memcached_return memcached_mget(memcached_st *ptr,
 
   memcached_finish(ptr);
 
+  if (master_key && master_key_length)
+    master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
+
   /* 
     If a server fails we warn about errors and start all over with sending keys
     to the server.
@@ -63,7 +89,10 @@ memcached_return memcached_mget(memcached_st *ptr,
   {
     unsigned int server_key;
 
-    server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
+    if (master_server_key)
+      server_key= master_server_key;
+    else
+      server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
 
     if (ptr->hosts[server_key].cursor_active == 0)
     {
index 3ea5df976a3df5d6f945b5b89b26b5c019411456..87c59d510ae55cbc32cff6def7d1817acd8104b6 100644 (file)
@@ -86,7 +86,7 @@ unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_le
 
   WATCHPOINT_ASSERT(hash);
 
-  if (ptr->distribution == MEMCACHED_DISTRIBUTION_MODULO)
+  if (ptr->distribution == MEMCACHED_DISTRIBUTION_MODULA)
   {
     return hash % ptr->number_of_hosts;
   }
index ba8835cb40ee223fac8c95e7d35bda6fb52e437e..43a18a98336a7474f027e5a493e792c8390fec97 100644 (file)
@@ -42,6 +42,7 @@ char *storage_op_string(memcached_storage_action verb)
 }
 
 static inline memcached_return memcached_send(memcached_st *ptr, 
+                                              char *master_key, size_t master_key_length, 
                                               char *key, size_t key_length, 
                                               char *value, size_t value_length, 
                                               time_t expiration,
@@ -65,7 +66,7 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  server_key= memcached_generate_hash(ptr, key, key_length);
+  server_key= memcached_generate_hash(ptr, master_key, master_key_length);
 
   if (cas)
     write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
@@ -133,8 +134,9 @@ memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_SET_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, SET_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, SET_OP);
   LIBMEMCACHED_MEMCACHED_SET_END();
   return rc;
 }
@@ -147,8 +149,9 @@ memcached_return memcached_add(memcached_st *ptr,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_ADD_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, ADD_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, ADD_OP);
   LIBMEMCACHED_MEMCACHED_ADD_END();
   return rc;
 }
@@ -161,8 +164,9 @@ memcached_return memcached_replace(memcached_st *ptr,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_REPLACE_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, REPLACE_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, REPLACE_OP);
   LIBMEMCACHED_MEMCACHED_REPLACE_END();
   return rc;
 }
@@ -174,7 +178,8 @@ memcached_return memcached_prepend(memcached_st *ptr,
                                    uint16_t flags)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, 0, PREPEND_OP);
   return rc;
 }
@@ -186,7 +191,8 @@ memcached_return memcached_append(memcached_st *ptr,
                                   uint16_t flags)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, 0, APPEND_OP);
   return rc;
 }
@@ -199,7 +205,99 @@ memcached_return memcached_cas(memcached_st *ptr,
                                uint64_t cas)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, cas, APPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_set_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length, 
+                                      char *key, size_t key_length, 
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_SET_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, SET_OP);
+  LIBMEMCACHED_MEMCACHED_SET_END();
+  return rc;
+}
+
+memcached_return memcached_add_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_ADD_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, ADD_OP);
+  LIBMEMCACHED_MEMCACHED_ADD_END();
+  return rc;
+}
+
+memcached_return memcached_replace_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_REPLACE_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, REPLACE_OP);
+  LIBMEMCACHED_MEMCACHED_REPLACE_END();
+  return rc;
+}
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, PREPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_append_by_key(memcached_st *ptr, 
+                                         char *master_key, size_t master_key_length,
+                                         char *key, size_t key_length,
+                                         char *value, size_t value_length, 
+                                         time_t expiration,
+                                         uint16_t flags)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, APPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_cas_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags,
+                                      uint64_t cas)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, cas, APPEND_OP);
   return rc;
 }
index e25d0c03d2e54506ddd7826e09a174ab846cb5cf..486ff7cedf5ffaf915a3a5bda798ee9440a8f4f3 100644 (file)
@@ -123,7 +123,7 @@ int main(int argc, char *argv[])
 void scheduler(memcached_server_st *servers, conclusions_st *conclusion)
 {
   unsigned int x;
-  unsigned int actual_loaded;
+  unsigned int actual_loaded= 0; /* Fix warning */
   memcached_st *memc;
 
   struct timeval start_time, end_time;
index 2ed34137628066a71694c27492aeae270cad7a24..d94eac3899036c66b5e0f2266d5fb500b0c4f976 100644 (file)
@@ -67,10 +67,13 @@ memerror - Creates human readable messages from libmemecached error codes.
 %{_mandir}/man3/libmemcached.3.gz
 %{_mandir}/man3/libmemcached_examples.3.gz
 %{_mandir}/man3/memcached_add.3.gz
+%{_mandir}/man3/memcached_add_by_key.3.gz
 %{_mandir}/man3/memcached_append.3.gz
+%{_mandir}/man3/memcached_append_by_key.3.gz
 %{_mandir}/man3/memcached_behavior_get.3.gz
 %{_mandir}/man3/memcached_behavior_set.3.gz
 %{_mandir}/man3/memcached_cas.3.gz
+%{_mandir}/man3/memcached_cas_by_key.3.gz
 %{_mandir}/man3/memcached_clone.3.gz
 %{_mandir}/man3/memcached_create.3.gz
 %{_mandir}/man3/memcached_decrement.3.gz
@@ -79,9 +82,12 @@ memerror - Creates human readable messages from libmemecached error codes.
 %{_mandir}/man3/memcached_fetch_result.3.gz
 %{_mandir}/man3/memcached_free.3.gz
 %{_mandir}/man3/memcached_get.3.gz
+%{_mandir}/man3/memcached_get_by_key.3.gz
 %{_mandir}/man3/memcached_increment.3.gz
 %{_mandir}/man3/memcached_mget.3.gz
+%{_mandir}/man3/memcached_mget_by_key.3.gz
 %{_mandir}/man3/memcached_prepend.3.gz
+%{_mandir}/man3/memcached_prepend_by_key.3.gz
 %{_mandir}/man3/memcached_quit.3.gz
 %{_mandir}/man3/memcached_replace.3.gz
 %{_mandir}/man3/memcached_server_add.3.gz
@@ -93,6 +99,7 @@ memerror - Creates human readable messages from libmemecached error codes.
 %{_mandir}/man3/memcached_server_push.3.gz
 %{_mandir}/man3/memcached_servers_parse.3.gz
 %{_mandir}/man3/memcached_set.3.gz
+%{_mandir}/man3/memcached_set_by_key.3.gz
 %{_mandir}/man3/memcached_stat.3.gz
 %{_mandir}/man3/memcached_stat_get_keys.3.gz
 %{_mandir}/man3/memcached_stat_get_value.3.gz
index dc84803e4f8aa2e1e2e8c810d97755f945ef1e6e..cb4269b3ad9a7202f86004466c03b9dcaca8b5f0 100644 (file)
@@ -32,9 +32,16 @@ record:
 record-extended:
        ./testapp extended > output2.res
 
-test: testapp
+test: testapp library_test
+       echo "Tests completed"
+
+library_test:
        ./testapp > output.cmp
        diff output.res output.cmp
+
+clients:
+       memcached -d -P /tmp/Xumemc.pid -p 12555
+       export MEMCACHED_SERVERS="localhost:12555"
        sh t/memcat.test > r/memcat.cmp
        diff r/memcat.res r/memcat.cmp
        sh t/memcp.test > r/memcp.cmp
@@ -45,10 +52,8 @@ test: testapp
        diff r/memslap.res r/memslap.cmp
        sh t/memstat.test > r/memstat.cmp
        diff r/memstat.res r/memstat.cmp
-
-test-extended: testapp
-       ./testapp extended > output.cmp
-       diff output2.res output.cmp
+       cat /tmp/Xumemc.pid | xargs kill
+       rm /tmp/Xumemc.pid
 
 valgrind:
        libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes  testapp
index 771178267b1d06c2fe29506605597f0b425cb39b..5d7fbf7dc460563bd3e6dca5cd082be6e729b3f1 100644 (file)
@@ -1379,6 +1379,7 @@ uint8_t user_supplied_bug9(memcached_st *memc)
                       &return_value_length, &flags, &rc)) != NULL)
   {
     assert(return_value);
+    free(return_value);
     count++;
   }
   assert(count == 3);
index 5338cf1784a542fd38b360318551532277831e0a..a1a8e6562bf5fef3f65a80475945da95f58b64c6 100644 (file)
@@ -1041,77 +1041,3 @@ Found key bytes_read
 Found key bytes_written
 Found key limit_maxbytes
 Found key threads
-Error 0 -> SUCCESS
-Error 1 -> FAILURE
-Error 2 -> HOSTNAME LOOKUP FAILURE
-Error 3 -> CONNECTION FAILURE
-Error 4 -> CONNECTION BIND FAILURE
-Error 5 -> WRITE FAILURE
-Error 6 -> READ FAILURE
-Error 7 -> UNKNOWN READ FAILURE
-Error 8 -> PROTOCOL ERROR
-Error 9 -> CLIENT ERROR
-Error 10 -> SERVER ERROR
-Error 11 -> CONNECTION SOCKET CREATE FAILURE
-Error 12 -> CONNECTION DATA EXISTS
-Error 13 -> CONNECTION DATA DOES NOT EXIST
-Error 14 -> NOT STORED
-Error 15 -> STORED
-Error 16 -> NOT FOUND
-Error 17 -> MEMORY ALLOCATION FAILURE
-Error 18 -> PARTIAL READ
-Error 19 -> SOME ERRORS WERE REPORTED
-Error 20 -> NO SERVERS DEFINED
-Error 21 -> SERVER END
-Error 22 -> SERVER DELETE
-Error 23 -> SERVER VALUE
-Error 24 -> STAT VALUE
-Error 25 -> SYSTEM ERROR
-Error 26 -> COULD NOT OPEN UNIX SOCKET
-Error 27 -> ACTION NOT SUPPORTED
-Error 28 -> A KEY LENGTH OF ZERO WAS PROVIDED
-Error 29 -> FETCH WAS NOT COMPLETED
-Found key pid
-Found key uptime
-Found key time
-Found key version
-Found key pointer_size
-Found key rusage_user
-Found key rusage_system
-Found key curr_items
-Found key total_items
-Found key bytes
-Found key curr_connections
-Found key total_connections
-Found key connection_structures
-Found key cmd_get
-Found key cmd_set
-Found key get_hits
-Found key get_misses
-Found key evictions
-Found key bytes_read
-Found key bytes_written
-Found key limit_maxbytes
-Found key threads
-Found key pid
-Found key uptime
-Found key time
-Found key version
-Found key pointer_size
-Found key rusage_user
-Found key rusage_system
-Found key curr_items
-Found key total_items
-Found key bytes
-Found key curr_connections
-Found key total_connections
-Found key connection_structures
-Found key cmd_get
-Found key cmd_set
-Found key get_hits
-Found key get_misses
-Found key evictions
-Found key bytes_read
-Found key bytes_written
-Found key limit_maxbytes
-Found key threads
index cc4ea80f202288c28bda66c2aadf4b5b8f0acdb7..c3c71ff9c4637aa072587597a3a6d1cad6616ac5 100644 (file)
@@ -2,4 +2,4 @@ MEMSLAP="../src/memslap"
 
 $MEMSLAP --help
 
-$MEMSLAP --servers=localhost --initial-load=5000 --verbose --flush --concurrency=500 --execute-number=500 > /dev/null
+$MEMSLAP --initial-load=5000 --verbose --flush --concurrency=500 --execute-number=500 > /dev/null
index 990f15e7483afc02e4dc2d22f79404aa4274ce20..f8cde94ddf5b3ecb8b0a5448b7108f7901ac09ef 100644 (file)
@@ -120,7 +120,7 @@ int main(int argc, char *argv[])
     test_st *run;
 
     run= next->tests;
-    if (collection_to_run && fnmatch(collection_to_run, next->name, FNM_CASEFOLD))
+    if (collection_to_run && fnmatch(collection_to_run, next->name, 0))
       continue;
 
     fprintf(stderr, "\n%s\n\n", next->name);
@@ -132,7 +132,7 @@ int main(int argc, char *argv[])
       memcached_return rc;
       struct timeval start_time, end_time;
 
-      if (wildcard && fnmatch(wildcard, run->name, FNM_CASEFOLD))
+      if (wildcard && fnmatch(wildcard, run->name, 0))
         continue;
 
       fprintf(stderr, "Testing %s", run->name);