From 92104790f8c3330d957f43aac5cc73134482fd83 Mon Sep 17 00:00:00 2001 From: Date: Fri, 2 May 2008 06:14:18 -0700 Subject: [PATCH 01/16] More tests for consistent. Fixed memory leak around addrinfo when host constantly fails. --- ChangeLog | 2 ++ clients/memslap.c | 3 --- libmemcached/memcached_connect.c | 10 ++++--- libmemcached/memcached_hosts.c | 6 +++++ tests/function.c | 46 ++++++++++++++++++++++++++++++++ tests/server.c | 1 - 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef18c9fb..5750968b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ + * New consistent distribution tests. + * Found a memory leak when a server constantly fails. * Changed default timeout to 1 second for poll timeouts * Wheel uses less memory/dynamic allocation for size (no longer limited to 512 hosts by default. diff --git a/clients/memslap.c b/clients/memslap.c index 52abb4b1..01f11e2d 100644 --- a/clients/memslap.c +++ b/clients/memslap.c @@ -355,9 +355,6 @@ void *run_task(void *p) if (context->execute_pairs) pairs_free(context->execute_pairs); - if (context->initial_pairs) - pairs_free(context->initial_pairs); - free(context); pthread_mutex_lock(&counter_mutex); diff --git a/libmemcached/memcached_connect.c b/libmemcached/memcached_connect.c index 74469870..7d6f85a4 100644 --- a/libmemcached/memcached_connect.c +++ b/libmemcached/memcached_connect.c @@ -218,6 +218,12 @@ test_connect: WATCHPOINT_NUMBER(ptr->root->connect_timeout); close(ptr->fd); ptr->fd= -1; + if (ptr->address_info) + { + freeaddrinfo(ptr->address_info); + ptr->address_info= NULL; + } + return MEMCACHED_ERRNO; } @@ -231,7 +237,6 @@ test_connect: default: handle_retry: ptr->cached_errno= errno; - WATCHPOINT_ERRNO(ptr->cached_errno); close(ptr->fd); ptr->fd= -1; if (ptr->root->retry_timeout) @@ -290,9 +295,6 @@ memcached_return memcached_connect(memcached_server_st *ptr) WATCHPOINT_ASSERT(0); } - if (rc != MEMCACHED_SUCCESS) - WATCHPOINT_ERROR(rc); - LIBMEMCACHED_MEMCACHED_CONNECT_END(); return rc; diff --git a/libmemcached/memcached_hosts.c b/libmemcached/memcached_hosts.c index 18e37d7b..231b2167 100644 --- a/libmemcached/memcached_hosts.c +++ b/libmemcached/memcached_hosts.c @@ -121,7 +121,10 @@ void server_list_free(memcached_st *ptr, memcached_server_st *servers) for (x= 0; x < servers->count; x++) if (servers[x].address_info) + { freeaddrinfo(servers[x].address_info); + servers[x].address_info= NULL; + } if (ptr && ptr->call_free) ptr->call_free(ptr, servers); @@ -218,7 +221,10 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); if (!new_host_list) + { + assert(0); return MEMCACHED_MEMORY_ALLOCATION_FAILURE; + } ptr->hosts= new_host_list; diff --git a/tests/function.c b/tests/function.c index cc63dadd..d3d23e47 100644 --- a/tests/function.c +++ b/tests/function.c @@ -2175,6 +2175,42 @@ test_return generate_buffer_data(memcached_st *memc) return 0; } +test_return get_read_count(memcached_st *memc) +{ + unsigned int x; + memcached_return rc; + memcached_st *clone; + + clone= memcached_clone(NULL, memc); + assert(clone); + + memcached_server_add(clone, "localhost", 6666); + + { + char *return_value; + size_t return_value_length; + uint32_t flags; + uint32_t count; + + for (x= count= 0; x < global_count; x++) + { + return_value= memcached_get(clone, global_keys[x], global_keys_length[x], + &return_value_length, &flags, &rc); + if (rc == MEMCACHED_SUCCESS) + { + count++; + if (return_value) + free(return_value); + } + } + fprintf(stderr, "\t%u -> %u", global_count, count); + } + + memcached_free(clone); + + return 0; +} + test_return get_read(memcached_st *memc) { unsigned int x; @@ -2695,6 +2731,13 @@ test_st generate_tests[] ={ {0, 0, 0} }; +test_st consistent_tests[] ={ + {"generate_pairs", 1, generate_pairs }, + {"generate_data", 1, generate_data }, + {"get_read", 0, get_read_count }, + {"cleanup", 1, cleanup_pairs }, + {0, 0, 0} +}; collection_st collection[] ={ {"block", 0, 0, tests}, @@ -2728,6 +2771,9 @@ collection_st collection[] ={ {"generate_md5", pre_md5, 0, generate_tests}, {"generate_murmur", pre_murmur, 0, generate_tests}, {"generate_nonblock", pre_nonblock, 0, generate_tests}, + {"consistent_not", 0, 0, consistent_tests}, + {"consistent_ketama", pre_behavior_ketama, 0, consistent_tests}, + {"consistent_wheel", enable_wheel, 0, consistent_tests}, {0, 0, 0, 0} }; diff --git a/tests/server.c b/tests/server.c index f5e44a9b..1248981b 100644 --- a/tests/server.c +++ b/tests/server.c @@ -42,7 +42,6 @@ void server_startup(server_startup_st *construct) else sprintf(buffer, "memcached -d -P /tmp/%umemc.pid -t 1 -p %u", x, x+ TEST_PORT_BASE); status= system(buffer); - WATCHPOINT_ASSERT(status == 0); count= sprintf(end_ptr, "localhost:%u,", x + TEST_PORT_BASE); end_ptr+= count; } -- 2.30.2 From b6baa1deacc15196103d3474e5b23e79c11bec93 Mon Sep 17 00:00:00 2001 From: Date: Fri, 2 May 2008 09:35:02 -0700 Subject: [PATCH 02/16] Adding in more tests for command line tools. --- clients/Makefile.am | 24 +++++++++++++++++++++++- clients/utilities.c | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/clients/Makefile.am b/clients/Makefile.am index 0dbec9f3..23debed1 100644 --- a/clients/Makefile.am +++ b/clients/Makefile.am @@ -28,7 +28,6 @@ memflush_SOURCES = memflush.c utilities.c memflush_LDADD = $(LDADDS) memflush_LDFLAGS = -rpath $(pkglibdir) - memerror_SOURCES = memerror.c utilities.c memerror_LDADD = $(LDADDS) memerror_LDFLAGS = -rpath $(pkglibdir) @@ -36,3 +35,26 @@ memerror_LDFLAGS = -rpath $(pkglibdir) memslap_SOURCES = memslap.c utilities.c generator.c execute.c memslap_LDADD = $(LDADDS) -lpthread memslap_LDFLAGS = -rpath $(pkglibdir) + +test-start-server: + memflush --servers=localhost + memcp --servers=localhost /etc/services + memcat --servers=localhost /etc/services + memrm --servers=localhost /etc/services + memstat --servers=localhost + memslap --servers=localhost + memslap --servers=localhost --concurrency=10 + memslap --servers=localhost --concurrency=10 --initial-load=1000 + memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 + memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=get + memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=set + memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=set --non-blocking + +valgrind: + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 --initial-load=1000 + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=get + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=set + libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes memslap --servers=localhost --concurrency=10 --initial-load=1000 --execute-number=10 --test=set --non-blocking diff --git a/clients/utilities.c b/clients/utilities.c index c845ed1a..b5755ee1 100644 --- a/clients/utilities.c +++ b/clients/utilities.c @@ -37,7 +37,7 @@ char *lookup_help(memcached_options option) case OPT_ADD: return("Use add command with memcached when storing."); case OPT_SLAP_EXECUTE_NUMBER: return("Number of times to execute the given test."); case OPT_SLAP_INITIAL_LOAD: return("Number of key pairs to load before executing tests."); - case OPT_SLAP_TEST: return("Test to run."); + case OPT_SLAP_TEST: return("Test to run (currently \"get\" or \"set\")."); case OPT_SLAP_CONCURRENCY: return("Number of users to simulate with load."); case OPT_SLAP_NON_BLOCK: return("Set TCP up to use non-blocking IO."); case OPT_SLAP_TCP_NODELAY: return("Set TCP socket up to use nodelay."); -- 2.30.2 From 7c41f51579dc36df33ec83a743dba8cc1ddc3e3f Mon Sep 17 00:00:00 2001 From: Date: Fri, 2 May 2008 15:11:07 -0700 Subject: [PATCH 03/16] Removed old asserts in client apps. --- clients/memcp.c | 8 ++++++-- clients/memslap.c | 1 - clients/memstat.c | 3 --- libmemcached/memcached_hosts.c | 3 --- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/clients/memcp.c b/clients/memcp.c index 780514c1..5b80fd64 100644 --- a/clients/memcp.c +++ b/clients/memcp.c @@ -10,7 +10,6 @@ #include #include #include -#include #include @@ -106,7 +105,12 @@ int main(int argc, char *argv[]) fprintf(stderr, "read: %s\n", strerror(errno)); exit(1); } - assert(read_length == sbuf.st_size); + + if (read_length != sbuf.st_size); + { + fprintf(stderr, "Failure reading from file\n"); + exit(1); + } if (opt_method == OPT_ADD) rc= memcached_add(memc, ptr, strlen(ptr), diff --git a/clients/memslap.c b/clients/memslap.c index 01f11e2d..6fc8176f 100644 --- a/clients/memslap.c +++ b/clients/memslap.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/clients/memstat.c b/clients/memstat.c index 3f1a78a3..36ee343e 100644 --- a/clients/memstat.c +++ b/clients/memstat.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #include @@ -71,8 +70,6 @@ int main(int argc, char *argv[]) char **ptr; list= memcached_stat_get_keys(memc, &stat[x], &rc); - assert(list); - assert(rc == MEMCACHED_SUCCESS); printf("Server: %s (%u)\n", memcached_server_name(memc, server_list[x]), memcached_server_port(memc, server_list[x])); diff --git a/libmemcached/memcached_hosts.c b/libmemcached/memcached_hosts.c index 231b2167..2678a7c1 100644 --- a/libmemcached/memcached_hosts.c +++ b/libmemcached/memcached_hosts.c @@ -221,10 +221,7 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); if (!new_host_list) - { - assert(0); return MEMCACHED_MEMORY_ALLOCATION_FAILURE; - } ptr->hosts= new_host_list; -- 2.30.2 From 3b967603f05c738a63c8f72c4ac49a1f79eb0091 Mon Sep 17 00:00:00 2001 From: Date: Sun, 4 May 2008 22:27:29 -0400 Subject: [PATCH 04/16] Work on C++ library. Pulled out result methods - need to define 'result' class. --- include/memcached.hh | 22 ++-------------------- tests/plus.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/include/memcached.hh b/include/memcached.hh index d394bbda..05583c74 100644 --- a/include/memcached.hh +++ b/include/memcached.hh @@ -24,24 +24,6 @@ public: memcached_clone(&memc, clone); WATCHPOINT; } - memcached_result_st *fetch_result() - { - memcached_return rc; - return memcached_fetch_result(&memc, &result, &rc); - } - /* - - memcached_return fetch_execute( - memcached_return ((*callback[]))(&memc, - &result, - void *context, - unsigned in number_of_callbacks)) - { - return memcached_fetch_execute(&memc, - (*callback[])(&memc, &result, context, - number_of_callbacks)); - } - */ char *fetch (char *key, size_t *key_length, size_t *value_length) { uint32_t flags; @@ -185,8 +167,8 @@ public: (uint32_t)0, cas); } - // Ok, so how do I have a 'delete' method, delete being a keyword? - memcached_return delete(char *key) + // using 'remove' vs. 'delete' since 'delete' is a keyword + memcached_return remove(char *key) { return memcached_delete (&memc, key, strlen(key), (time_t)0); diff --git a/tests/plus.cpp b/tests/plus.cpp index 10b2440a..2fb0e83d 100644 --- a/tests/plus.cpp +++ b/tests/plus.cpp @@ -29,6 +29,39 @@ uint8_t basic_test(memcached_st *memc) return 0; } +uint8_t increment_test(memcached_st *memc) +{ + Memcached mcach; + memcached_return rc; + char *key= "inctest"; + char *inc_value= "1"; + char *ret_value; + uint64_t int_inc_value; + uint64_t int_ret_value; + size_t value_length; + + mcach.set(key, inc_value, strlen(inc_value)); + ret_value= mcach.get(key, &value_length); + printf("\nretvalue %s\n",ret_value); + int_inc_value= atoi(inc_value); + int_ret_value= atoi(ret_value); + assert(int_ret_value == int_inc_value); + + rc= mcach.increment(key, 1, &int_ret_value); + assert(rc == MEMCACHED_SUCCESS); + assert(int_ret_value == 2); + + rc= mcach.increment(key, 1, &int_ret_value); + assert(rc == MEMCACHED_SUCCESS); + assert(int_ret_value == 3); + + rc= mcach.increment(key, 5, &int_ret_value); + assert(rc == MEMCACHED_SUCCESS); + assert(int_ret_value == 8); + + return 0; +} + uint8_t basic_master_key_test(memcached_st *memc) { Memcached foo; @@ -53,6 +86,7 @@ uint8_t basic_master_key_test(memcached_st *memc) test_st tests[] ={ {"basic", 0, basic_test }, + {"basic", 0, increment_test }, {"basic_master_key", 0, basic_master_key_test }, {0, 0, 0} }; -- 2.30.2 From 5ab3aecd63a2276c78f188e7c9f55918fb8fed6c Mon Sep 17 00:00:00 2001 From: Date: Sun, 4 May 2008 23:03:19 -0400 Subject: [PATCH 05/16] Removed increment test until able to resolve issue - need to talk to Brian --- tests/plus.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/plus.cpp b/tests/plus.cpp index 2fb0e83d..2e5ea513 100644 --- a/tests/plus.cpp +++ b/tests/plus.cpp @@ -86,7 +86,6 @@ uint8_t basic_master_key_test(memcached_st *memc) test_st tests[] ={ {"basic", 0, basic_test }, - {"basic", 0, increment_test }, {"basic_master_key", 0, basic_master_key_test }, {0, 0, 0} }; -- 2.30.2 From cd9dbd3c5a64749b2b0f10af086fa464210aaf7d Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Mon, 5 May 2008 08:34:42 -0700 Subject: [PATCH 06/16] Adding version .20 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 6ab35316..78af7501 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ +0.20 Mon May 5 08:34:26 PDT 2008 * New consistent distribution tests. * Found a memory leak when a server constantly fails. * Fix in watchpoint macro -- 2.30.2 From 84a1c1e9febd2f9a705cc68e7af06018dcb7d176 Mon Sep 17 00:00:00 2001 From: Date: Thu, 15 May 2008 08:08:21 -0700 Subject: [PATCH 08/16] Fix in spelling of memcached_strerror() --- docs/libmemcached.pod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/libmemcached.pod b/docs/libmemcached.pod index 06a22fe4..b950a63d 100755 --- a/docs/libmemcached.pod +++ b/docs/libmemcached.pod @@ -33,7 +33,7 @@ written in order to encapsulate the C. It is not recommended that you operate directly against the structure. Nearly all functions return a C value. -This value can be translated to a printable string with memcached_strerr(3). +This value can be translated to a printable string with memcached_strerror(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. -- 2.30.2 From 571fad579922f2b10873193500dfd0652f4fdc37 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 20 May 2008 16:05:04 -0700 Subject: [PATCH 09/16] Fixed all key methods to now take const char * (all previous code will work just fine). --- ChangeLog | 3 ++ docs/memcached_auto.pod | 4 +- docs/memcached_delete.pod | 6 +-- docs/memcached_get.pod | 10 ++--- docs/memcached_set.pod | 60 ++++++++++++++-------------- libmemcached/Makefile.am | 1 + libmemcached/common.h | 12 +++--- libmemcached/hsieh_hash.c | 2 +- libmemcached/md5.c | 8 ++-- libmemcached/memcached.h | 38 +++--------------- libmemcached/memcached_auto.c | 10 ++--- libmemcached/memcached_delete.c | 6 +-- libmemcached/memcached_do.c | 2 +- libmemcached/memcached_get.c | 16 +++++--- libmemcached/memcached_get.h | 56 ++++++++++++++++++++++++++ libmemcached/memcached_hash.c | 14 +++---- libmemcached/memcached_io.c | 4 +- libmemcached/memcached_io.h | 2 +- libmemcached/memcached_stats.c | 2 +- libmemcached/memcached_storage.c | 68 ++++++++++++++++---------------- libmemcached/memcached_storage.h | 60 ++++++++++++++-------------- libmemcached/memcached_types.h | 4 +- libmemcached/murmur_hash.c | 2 +- 23 files changed, 214 insertions(+), 176 deletions(-) create mode 100644 libmemcached/memcached_get.h diff --git a/ChangeLog b/ChangeLog index 78af7501..f85b6295 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +0.21 + * Change of char * to const char * for all key based functions. + 0.20 Mon May 5 08:34:26 PDT 2008 * New consistent distribution tests. * Found a memory leak when a server constantly fails. diff --git a/docs/memcached_auto.pod b/docs/memcached_auto.pod index 27332e93..df0a8b58 100755 --- a/docs/memcached_auto.pod +++ b/docs/memcached_auto.pod @@ -12,13 +12,13 @@ C Client Library for memcached (libmemcached, -lmemcached) memcached_return memcached_increment (memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, unsigned int offset, uint64_t *value); memcached_return memcached_decrement (memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, unsigned int offset, uint64_t *value); diff --git a/docs/memcached_delete.pod b/docs/memcached_delete.pod index 18fec84b..41a55df9 100755 --- a/docs/memcached_delete.pod +++ b/docs/memcached_delete.pod @@ -12,13 +12,13 @@ C Client Library for memcached (libmemcached, -lmemcached) memcached_return memcached_delete (memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, time_t expiration); memcached_return memcached_delete_by_key (memcached_st *ptr, - char *master_key, size_t master_key_length, - char *key, size_t key_length, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, time_t expiration); =head1 DESCRIPTION diff --git a/docs/memcached_get.pod b/docs/memcached_get.pod index 5557e7c3..df0ac779 100755 --- a/docs/memcached_get.pod +++ b/docs/memcached_get.pod @@ -16,7 +16,7 @@ C Client Library for memcached (libmemcached, -lmemcached) memcached_return *error); char *memcached_get (memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error); @@ -27,20 +27,20 @@ C Client Library for memcached (libmemcached, -lmemcached) 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error); memcached_return memcached_mget_by_key(memcached_st *ptr, - char *master_key, size_t master_key_length, + const 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, + const char *key, size_t *key_length, size_t *value_length, uint32_t *flags, memcached_return *error); diff --git a/docs/memcached_set.pod b/docs/memcached_set.pod index 6e962d38..5e7ac186 100755 --- a/docs/memcached_set.pod +++ b/docs/memcached_set.pod @@ -12,91 +12,91 @@ C Client Library for memcached (libmemcached, -lmemcached) memcached_return memcached_set (memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_add (memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_replace (memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_prepend(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) memcached_return memcached_append(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) memcached_return memcached_cas(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags, uint64_t cas); diff --git a/libmemcached/Makefile.am b/libmemcached/Makefile.am index 18cdf23a..550b4890 100644 --- a/libmemcached/Makefile.am +++ b/libmemcached/Makefile.am @@ -28,6 +28,7 @@ pkginclude_HEADERS= memcached.h \ memcached.hh \ libmemcached_config.h \ memcached_constants.h \ + memcached_get.h \ memcached_result.h \ memcached_server.h \ memcached_storage.h \ diff --git a/libmemcached/common.h b/libmemcached/common.h index b2406196..ad6ccd7d 100644 --- a/libmemcached/common.h +++ b/libmemcached/common.h @@ -80,24 +80,24 @@ typedef enum { } memcached_flags; /* Hashing algo */ -void md5_signature(unsigned char *key, unsigned int length, unsigned char *result); +void md5_signature(const unsigned char *key, unsigned int length, unsigned char *result); uint32_t hash_crc32(const char *data, size_t data_len); -uint32_t hsieh_hash(char *key, size_t key_length); -uint32_t murmur_hash(char *key, size_t key_length); +uint32_t hsieh_hash(const char *key, size_t key_length); +uint32_t murmur_hash(const char *key, size_t key_length); memcached_return memcached_connect(memcached_server_st *ptr); memcached_return memcached_response(memcached_server_st *ptr, char *buffer, size_t buffer_length, memcached_result_st *result); -uint32_t memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length); +uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_length); void memcached_quit_server(memcached_server_st *ptr, uint8_t io_death); #define memcached_server_response_increment(A) (A)->cursor_active++ #define memcached_server_response_decrement(A) (A)->cursor_active-- #define memcached_server_response_reset(A) (A)->cursor_active=0 -memcached_return memcached_do(memcached_server_st *ptr, char *commmand, +memcached_return memcached_do(memcached_server_st *ptr, const char *commmand, size_t command_length, uint8_t with_flush); memcached_return memcached_version(memcached_st *ptr); memcached_return value_fetch(memcached_server_st *ptr, @@ -110,5 +110,5 @@ memcached_return memcachd_key_test(char **keys, size_t *key_length, memcached_return run_distribution(memcached_st *ptr); -uint32_t generate_hash(memcached_st *ptr, char *key, size_t key_length); +uint32_t generate_hash(memcached_st *ptr, const char *key, size_t key_length); #endif /* __COMMON_H__ */ diff --git a/libmemcached/hsieh_hash.c b/libmemcached/hsieh_hash.c index 9f42a94d..e6c23cd9 100644 --- a/libmemcached/hsieh_hash.c +++ b/libmemcached/hsieh_hash.c @@ -17,7 +17,7 @@ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif -uint32_t hsieh_hash(char *key, size_t key_length) +uint32_t hsieh_hash(const char *key, size_t key_length) { uint32_t hash = 0, tmp; int rem; diff --git a/libmemcached/md5.c b/libmemcached/md5.c index 61f8d692..ef43035a 100644 --- a/libmemcached/md5.c +++ b/libmemcached/md5.c @@ -50,7 +50,7 @@ typedef struct { static void MD5Init (MD5_CTX *context); /* context */ static void MD5Update ( MD5_CTX *context, /* context */ - unsigned char *input, /* input block */ + const unsigned char *input, /* input block */ unsigned int inputLen); /* length of input block */ static void MD5Final ( unsigned char digest[16], /* message digest */ MD5_CTX *context); /* context */ @@ -128,7 +128,7 @@ Rotation is separate from addition to prevent recomputation. Just a simple method for getting the signature result must be == 16 */ -void md5_signature(unsigned char *key, unsigned int length, unsigned char *result) +void md5_signature(const unsigned char *key, unsigned int length, unsigned char *result) { MD5_CTX my_md5; @@ -157,7 +157,7 @@ static void MD5Init (MD5_CTX *context) /* context */ static void MD5Update ( MD5_CTX *context, /* context */ - unsigned char *input, /* input block */ + const unsigned char *input, /* input block */ unsigned int inputLen) /* length of input block */ { unsigned int i, idx, partLen; @@ -181,7 +181,7 @@ static void MD5Update ( MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) - MD5Transform (context->state, &input[i]); + MD5Transform (context->state, (unsigned char *)&input[i]); idx = 0; } diff --git a/libmemcached/memcached.h b/libmemcached/memcached.h index 3a1def48..b907809d 100644 --- a/libmemcached/memcached.h +++ b/libmemcached/memcached.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -106,14 +107,14 @@ memcached_st *memcached_create(memcached_st *ptr); void memcached_free(memcached_st *ptr); memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr); -memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length, +memcached_return memcached_delete(memcached_st *ptr, const char *key, size_t key_length, time_t expiration); memcached_return memcached_increment(memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, uint32_t offset, uint64_t *value); memcached_return memcached_decrement(memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, uint32_t offset, uint64_t *value); void memcached_stat_free(memcached_st *, memcached_stat_st *); @@ -127,21 +128,6 @@ char *memcached_strerror(memcached_st *ptr, memcached_return rc); memcached_return memcached_behavior_set(memcached_st *ptr, memcached_behavior flag, uint64_t data); uint64_t memcached_behavior_get(memcached_st *ptr, memcached_behavior flag); -/* Get functions */ -char *memcached_get(memcached_st *ptr, char *key, size_t key_length, - size_t *value_length, - uint32_t *flags, - memcached_return *error); -memcached_return memcached_mget(memcached_st *ptr, - char **keys, size_t *key_length, - unsigned int number_of_keys); -char *memcached_fetch(memcached_st *ptr, char *key, size_t *key_length, - size_t *value_length, uint32_t *flags, - memcached_return *error); -memcached_result_st *memcached_fetch_result(memcached_st *ptr, - memcached_result_st *result, - memcached_return *error); - /* Server Public functions */ memcached_return memcached_server_add_udp(memcached_st *ptr, @@ -165,21 +151,9 @@ 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, - uint32_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_delete_by_key(memcached_st *ptr, - char *master_key, size_t master_key_length, - char *key, size_t key_length, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, time_t expiration); memcached_return memcached_fetch_execute(memcached_st *ptr, diff --git a/libmemcached/memcached_auto.c b/libmemcached/memcached_auto.c index a607ed66..bc6adc0f 100644 --- a/libmemcached/memcached_auto.c +++ b/libmemcached/memcached_auto.c @@ -1,8 +1,8 @@ #include "common.h" static memcached_return memcached_auto(memcached_st *ptr, - char *verb, - char *key, size_t key_length, + const char *verb, + const char *key, size_t key_length, unsigned int offset, uint64_t *value) { @@ -17,7 +17,7 @@ static memcached_return memcached_auto(memcached_st *ptr, unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0) return MEMCACHED_NO_SERVERS; - if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) + if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) return MEMCACHED_BAD_KEY_PROVIDED; server_key= memcached_generate_hash(ptr, key, key_length); @@ -62,7 +62,7 @@ static memcached_return memcached_auto(memcached_st *ptr, } memcached_return memcached_increment(memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, uint32_t offset, uint64_t *value) { @@ -76,7 +76,7 @@ memcached_return memcached_increment(memcached_st *ptr, } memcached_return memcached_decrement(memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, uint32_t offset, uint64_t *value) { diff --git a/libmemcached/memcached_delete.c b/libmemcached/memcached_delete.c index 37a28add..5df976ad 100644 --- a/libmemcached/memcached_delete.c +++ b/libmemcached/memcached_delete.c @@ -1,6 +1,6 @@ #include "common.h" -memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length, +memcached_return memcached_delete(memcached_st *ptr, const char *key, size_t key_length, time_t expiration) { return memcached_delete_by_key(ptr, key, key_length, @@ -8,8 +8,8 @@ memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_lengt } memcached_return memcached_delete_by_key(memcached_st *ptr, - char *master_key, size_t master_key_length, - char *key, size_t key_length, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, time_t expiration) { char to_write; diff --git a/libmemcached/memcached_do.c b/libmemcached/memcached_do.c index c4bf574f..671b9fa3 100644 --- a/libmemcached/memcached_do.c +++ b/libmemcached/memcached_do.c @@ -1,6 +1,6 @@ #include "common.h" -memcached_return memcached_do(memcached_server_st *ptr, char *command, +memcached_return memcached_do(memcached_server_st *ptr, const char *command, size_t command_length, uint8_t with_flush) { memcached_return rc; diff --git a/libmemcached/memcached_get.c b/libmemcached/memcached_get.c index 852e90dd..a2f7716d 100644 --- a/libmemcached/memcached_get.c +++ b/libmemcached/memcached_get.c @@ -4,7 +4,8 @@ /* What happens if no servers exist? */ -char *memcached_get(memcached_st *ptr, char *key, size_t key_length, +char *memcached_get(memcached_st *ptr, const char *key, + size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error) @@ -14,8 +15,9 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length, } char *memcached_get_by_key(memcached_st *ptr, - char *master_key, size_t master_key_length, - char *key, size_t key_length, + const char *master_key, + size_t master_key_length, + const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error) @@ -29,7 +31,7 @@ char *memcached_get_by_key(memcached_st *ptr, *error= memcached_mget_by_key(ptr, master_key, master_key_length, - &key, &key_length, 1); + (char **)&key, &key_length, 1); value= memcached_fetch(ptr, NULL, NULL, value_length, flags, error); @@ -95,8 +97,10 @@ memcached_return memcached_mget(memcached_st *ptr, } memcached_return memcached_mget_by_key(memcached_st *ptr, - char *master_key, size_t master_key_length, - char **keys, size_t *key_length, + const char *master_key, + size_t master_key_length, + char **keys, + size_t *key_length, unsigned int number_of_keys) { unsigned int x; diff --git a/libmemcached/memcached_get.h b/libmemcached/memcached_get.h new file mode 100644 index 00000000..5535f345 --- /dev/null +++ b/libmemcached/memcached_get.h @@ -0,0 +1,56 @@ +/* + * Summary: Get functions for libmemcached + * + * Copy: See Copyright for the status of this software. + * + * Author: Brian Aker + */ + +#ifndef __MEMCACHED_GET_H__ +#define __MEMCACHED_GET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public defines */ +char *memcached_get(memcached_st *ptr, + const char *key, size_t key_length, + size_t *value_length, + uint32_t *flags, + memcached_return *error); + +memcached_return memcached_mget(memcached_st *ptr, + char **keys, size_t *key_length, + unsigned int number_of_keys); + +char *memcached_get_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + size_t *value_length, + uint32_t *flags, + memcached_return *error); + +memcached_return memcached_mget_by_key(memcached_st *ptr, + const 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, + size_t *value_length, uint32_t *flags, + memcached_return *error); + +memcached_result_st *memcached_fetch_result(memcached_st *ptr, + memcached_result_st *result, + memcached_return *error); + + + +#ifdef __cplusplus +} +#endif + +#endif /* __MEMCACHED_GET_H__ */ diff --git a/libmemcached/memcached_hash.c b/libmemcached/memcached_hash.c index e2454ac9..cca7b5a4 100644 --- a/libmemcached/memcached_hash.c +++ b/libmemcached/memcached_hash.c @@ -8,10 +8,10 @@ static uint32_t FNV_32_INIT= 2166136261UL; static uint32_t FNV_32_PRIME= 16777619; /* Prototypes */ -static uint32_t internal_generate_hash(char *key, size_t key_length); -static uint32_t internal_generate_md5(char *key, size_t key_length); +static uint32_t internal_generate_hash(const char *key, size_t key_length); +static uint32_t internal_generate_md5(const char *key, size_t key_length); -uint32_t generate_hash(memcached_st *ptr, char *key, size_t key_length) +uint32_t generate_hash(memcached_st *ptr, const char *key, size_t key_length) { uint32_t hash= 1; /* Just here to remove compile warning */ uint32_t x= 0; @@ -161,7 +161,7 @@ unsigned int dispatch_host(memcached_st *ptr, uint32_t hash) One day make this public, and have it return the actual memcached_server_st to the calling application. */ -uint32_t memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length) +uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_length) { uint32_t hash= 1; /* Just here to remove compile warning */ @@ -176,9 +176,9 @@ uint32_t memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length return dispatch_host(ptr, hash); } -static uint32_t internal_generate_hash(char *key, size_t key_length) +static uint32_t internal_generate_hash(const char *key, size_t key_length) { - char *ptr= key; + const char *ptr= key; uint32_t value= 0; while (--key_length) @@ -194,7 +194,7 @@ static uint32_t internal_generate_hash(char *key, size_t key_length) return value == 0 ? 1 : value; } -static uint32_t internal_generate_md5(char *key, size_t key_length) +static uint32_t internal_generate_md5(const char *key, size_t key_length) { unsigned char results[16]; diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c index b9261f3d..38544102 100644 --- a/libmemcached/memcached_io.c +++ b/libmemcached/memcached_io.c @@ -158,10 +158,10 @@ ssize_t memcached_io_read(memcached_server_st *ptr, } ssize_t memcached_io_write(memcached_server_st *ptr, - char *buffer, size_t length, char with_flush) + const char *buffer, size_t length, char with_flush) { size_t original_length; - char* buffer_ptr; + const char* buffer_ptr; original_length= length; buffer_ptr= buffer; diff --git a/libmemcached/memcached_io.h b/libmemcached/memcached_io.h index 30ac18b2..887f5200 100644 --- a/libmemcached/memcached_io.h +++ b/libmemcached/memcached_io.h @@ -2,7 +2,7 @@ #include ssize_t memcached_io_write(memcached_server_st *ptr, - char *buffer, size_t length, char with_flush); + const char *buffer, size_t length, char with_flush); void memcached_io_reset(memcached_server_st *ptr); ssize_t memcached_io_read(memcached_server_st *ptr, char *buffer, size_t length); diff --git a/libmemcached/memcached_stats.c b/libmemcached/memcached_stats.c index 3abc9b19..cf3adc12 100644 --- a/libmemcached/memcached_stats.c +++ b/libmemcached/memcached_stats.c @@ -192,7 +192,7 @@ char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *stat, else if (!memcmp("bytes_written", key, strlen("bytes_written"))) length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)stat->bytes_written); else if (!memcmp("limit_maxbytes", key, strlen("limit_maxbytes"))) - length= snprintf(buffer, SMALL_STRING_LEN,"%llu", stat->limit_maxbytes); + length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)stat->limit_maxbytes); else if (!memcmp("threads", key, strlen("threads"))) length= snprintf(buffer, SMALL_STRING_LEN,"%u", stat->threads); else diff --git a/libmemcached/memcached_storage.c b/libmemcached/memcached_storage.c index 30afd263..8f04c528 100644 --- a/libmemcached/memcached_storage.c +++ b/libmemcached/memcached_storage.c @@ -42,9 +42,9 @@ static 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags, uint64_t cas, @@ -65,7 +65,7 @@ static inline memcached_return memcached_send(memcached_st *ptr, unlikely (ptr->number_of_hosts == 0) return MEMCACHED_NO_SERVERS; - if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) + if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) return MEMCACHED_BAD_KEY_PROVIDED; server_key= memcached_generate_hash(ptr, master_key, master_key_length); @@ -125,8 +125,8 @@ error: return rc; } -memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length, - char *value, size_t value_length, +memcached_return memcached_set(memcached_st *ptr, const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -140,8 +140,8 @@ memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length, } memcached_return memcached_add(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -155,8 +155,8 @@ memcached_return memcached_add(memcached_st *ptr, } memcached_return memcached_replace(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -170,8 +170,8 @@ memcached_return memcached_replace(memcached_st *ptr, } memcached_return memcached_prepend(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -183,8 +183,8 @@ memcached_return memcached_prepend(memcached_st *ptr, } memcached_return memcached_append(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -196,8 +196,8 @@ memcached_return memcached_append(memcached_st *ptr, } memcached_return memcached_cas(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags, uint64_t cas) @@ -210,9 +210,9 @@ memcached_return memcached_cas(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -226,9 +226,9 @@ memcached_return memcached_set_by_key(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -242,9 +242,9 @@ memcached_return memcached_add_by_key(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -258,9 +258,9 @@ memcached_return memcached_replace_by_key(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -272,9 +272,9 @@ memcached_return memcached_prepend_by_key(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags) { @@ -286,9 +286,9 @@ memcached_return memcached_append_by_key(memcached_st *ptr, } 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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags, uint64_t cas) diff --git a/libmemcached/memcached_storage.h b/libmemcached/memcached_storage.h index 98211f6b..25adc983 100644 --- a/libmemcached/memcached_storage.h +++ b/libmemcached/memcached_storage.h @@ -14,74 +14,74 @@ extern "C" { #endif /* All of the functions for adding data to the server */ -memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length, - char *value, size_t value_length, +memcached_return memcached_set(memcached_st *ptr, const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); -memcached_return memcached_add(memcached_st *ptr, char *key, size_t key_length, - char *value, size_t value_length, +memcached_return memcached_add(memcached_st *ptr, const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); -memcached_return memcached_replace(memcached_st *ptr, char *key, size_t key_length, - char *value, size_t value_length, +memcached_return memcached_replace(memcached_st *ptr, const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_append(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_prepend(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags); memcached_return memcached_cas(memcached_st *ptr, - char *key, size_t key_length, - char *value, size_t value_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_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, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, time_t expiration, uint32_t flags, uint64_t cas); diff --git a/libmemcached/memcached_types.h b/libmemcached/memcached_types.h index 20837af9..f00f9afa 100644 --- a/libmemcached/memcached_types.h +++ b/libmemcached/memcached_types.h @@ -27,10 +27,10 @@ typedef void *(*memcached_realloc_function)(memcached_st *ptr, void *mem, const typedef memcached_return (*memcached_execute_function)(memcached_st *ptr, memcached_result_st *result, void *context); typedef memcached_return (*memcached_server_function)(memcached_st *ptr, memcached_server_st *server, void *context); typedef memcached_return (*memcached_trigger_key)(memcached_st *ptr, - char *key, size_t key_length, + const char *key, size_t key_length, memcached_result_st *result); typedef memcached_return (*memcached_trigger_delete_key)(memcached_st *ptr, - char *key, size_t key_length); + const char *key, size_t key_length); #ifdef __cplusplus } diff --git a/libmemcached/murmur_hash.c b/libmemcached/murmur_hash.c index 7cfcaa9e..7275aa34 100644 --- a/libmemcached/murmur_hash.c +++ b/libmemcached/murmur_hash.c @@ -6,7 +6,7 @@ #define MIX(h,k,m) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; } -uint32_t murmur_hash(char *key, size_t length) +uint32_t murmur_hash(const char *key, size_t length) { const uint32_t m= 0x5bd1e995; const int r= 16; -- 2.30.2 From d5ffc30a6f369ea210e92e6a55333121d32b9a55 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 20 May 2008 17:57:36 -0700 Subject: [PATCH 10/16] MEMCACHED_CALLBACK_PREFIX_KEY added (so domaining keys is now aailable in the driver). --- ChangeLog | 2 ++ docs/memcached_callback.pod | 8 ++++++ libmemcached/memcached.c | 3 +++ libmemcached/memcached.h | 2 ++ libmemcached/memcached_auto.c | 3 ++- libmemcached/memcached_callback.c | 27 +++++++++++++++++++++ libmemcached/memcached_constants.h | 2 ++ libmemcached/memcached_delete.c | 8 ++++-- libmemcached/memcached_fetch.c | 15 +++++++++--- libmemcached/memcached_get.c | 11 +++++++++ libmemcached/memcached_storage.c | 6 +++-- tests/function.c | 39 +++++++++++++++++++++++++++++- 12 files changed, 116 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index f85b6295..4f3bffb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 0.21 * Change of char * to const char * for all key based functions. + * New MEMCACHED_CALLBACK_PREFIX_KEY added. You can now create domains for + values. 0.20 Mon May 5 08:34:26 PDT 2008 * New consistent distribution tests. diff --git a/docs/memcached_callback.pod b/docs/memcached_callback.pod index a9c0ac41..9b56a5fc 100755 --- a/docs/memcached_callback.pod +++ b/docs/memcached_callback.pod @@ -47,6 +47,14 @@ point of its execution all connections have been closed. When memcached_delete() is called this function will be excuted. At the point of its execution all connections have been closed. +=item MEMCACHED_CALLBACK_PREFIX_KEY + +You can set a value which will be used to create a domain for your keys. +The value specified here will be appended to each of your keys. The value can not +be greater then MEMCACHED_PREFIX_KEY_MAX_SIZE and will reduce MEMCACHED_MAX_KEY by +the value of your key. The prefix key is only applied to the primary key, +not the master key. + =item MEMCACHED_CALLBACK_USER_DATA This allows you to store a pointer to a specifc piece of data. This can be diff --git a/libmemcached/memcached.c b/libmemcached/memcached.c index b681f6cb..74e75706 100644 --- a/libmemcached/memcached.c +++ b/libmemcached/memcached.c @@ -121,6 +121,9 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr) new_clone->get_key_failure= ptr->get_key_failure; new_clone->delete_trigger= ptr->delete_trigger; + if (ptr->prefix_key[0] != 0) + strcpy(new_clone->prefix_key, ptr->prefix_key); + rc= run_distribution(new_clone); if (rc != MEMCACHED_SUCCESS) { diff --git a/libmemcached/memcached.h b/libmemcached/memcached.h index b907809d..e753dc65 100644 --- a/libmemcached/memcached.h +++ b/libmemcached/memcached.h @@ -93,6 +93,8 @@ struct memcached_st { memcached_realloc_function call_realloc; memcached_trigger_key get_key_failure; memcached_trigger_delete_key delete_trigger; + char prefix_key[MEMCACHED_PREFIX_KEY_MAX_SIZE]; + size_t prefix_key_length; #ifdef NOT_USED /* Future Use */ uint8_t replicas; memcached_return warning; diff --git a/libmemcached/memcached_auto.c b/libmemcached/memcached_auto.c index bc6adc0f..b3eae3b6 100644 --- a/libmemcached/memcached_auto.c +++ b/libmemcached/memcached_auto.c @@ -23,7 +23,8 @@ static memcached_return memcached_auto(memcached_st *ptr, server_key= memcached_generate_hash(ptr, key, key_length); send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "%s %.*s %u\r\n", verb, + "%s %s%.*s %u\r\n", verb, + ptr->prefix_key, (int)key_length, key, offset); unlikely (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) diff --git a/libmemcached/memcached_callback.c b/libmemcached/memcached_callback.c index 6db2db82..c231716d 100644 --- a/libmemcached/memcached_callback.c +++ b/libmemcached/memcached_callback.c @@ -13,6 +13,28 @@ memcached_return memcached_callback_set(memcached_st *ptr, { switch (flag) { + case MEMCACHED_CALLBACK_PREFIX_KEY: + { + char *key= (char *)data; + + if (key) + { + ptr->prefix_key_length= strlen(key); + if ((ptr->prefix_key_length > MEMCACHED_PREFIX_KEY_MAX_SIZE -1) + || (strcpy(ptr->prefix_key, key) == NULL)) + { + ptr->prefix_key_length= 0; + return MEMCACHED_BAD_KEY_PROVIDED; + } + } + else + { + memset(ptr->prefix_key, 0, MEMCACHED_PREFIX_KEY_MAX_SIZE); + ptr->prefix_key_length= 0; + } + + break; + } case MEMCACHED_CALLBACK_USER_DATA: { ptr->user_data= data; @@ -77,6 +99,11 @@ void *memcached_callback_get(memcached_st *ptr, switch (flag) { + case MEMCACHED_CALLBACK_PREFIX_KEY: + { + *error= ptr->prefix_key[0] != 0 ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE; + return (void *)ptr->prefix_key; + } case MEMCACHED_CALLBACK_USER_DATA: { *error= ptr->user_data ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE; diff --git a/libmemcached/memcached_constants.h b/libmemcached/memcached_constants.h index f1dd52e9..f698cff6 100644 --- a/libmemcached/memcached_constants.h +++ b/libmemcached/memcached_constants.h @@ -24,6 +24,7 @@ extern "C" { #define MEMCACHED_STRIDE 4 #define MEMCACHED_DEFAULT_TIMEOUT 1000 #define MEMCACHED_CONTINUUM_ADDITION 10 /* How many extra slots we should build for in the continuum */ +#define MEMCACHED_PREFIX_KEY_MAX_SIZE 12 typedef enum { MEMCACHED_SUCCESS, @@ -89,6 +90,7 @@ typedef enum { } memcached_behavior; typedef enum { + MEMCACHED_CALLBACK_PREFIX_KEY, MEMCACHED_CALLBACK_USER_DATA, MEMCACHED_CALLBACK_CLEANUP_FUNCTION, MEMCACHED_CALLBACK_CLONE_FUNCTION, diff --git a/libmemcached/memcached_delete.c b/libmemcached/memcached_delete.c index 5df976ad..a105f552 100644 --- a/libmemcached/memcached_delete.c +++ b/libmemcached/memcached_delete.c @@ -30,11 +30,15 @@ memcached_return memcached_delete_by_key(memcached_st *ptr, if (expiration) send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "delete %.*s %llu\r\n", (int)key_length, key, + "delete %s%.*s %llu\r\n", + ptr->prefix_key, + (int)key_length, key, (unsigned long long)expiration); else send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "delete %.*s\r\n", (int)key_length, key); + "delete %s%.*s\r\n", + ptr->prefix_key, + (int)key_length, key); if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) { diff --git a/libmemcached/memcached_fetch.c b/libmemcached/memcached_fetch.c index 303e8cc3..2cefe65f 100644 --- a/libmemcached/memcached_fetch.c +++ b/libmemcached/memcached_fetch.c @@ -14,6 +14,7 @@ memcached_return value_fetch(memcached_server_st *ptr, size_t to_read; char *value_ptr; + WATCHPOINT_ASSERT(ptr->root); end_ptr= buffer + MEMCACHED_DEFAULT_COMMAND_SIZE; memcached_result_reset(result); @@ -25,15 +26,21 @@ memcached_return value_fetch(memcached_server_st *ptr, /* We load the key */ { char *key; + size_t prefix_length; key= result->key; result->key_length= 0; - for (; isgraph(*string_ptr); string_ptr++) + for (prefix_length= ptr->root->prefix_key_length; isgraph(*string_ptr); string_ptr++) { - *key= *string_ptr; - key++; - result->key_length++; + if (prefix_length == 0) + { + *key= *string_ptr; + key++; + result->key_length++; + } + else + prefix_length--; } result->key[result->key_length]= 0; } diff --git a/libmemcached/memcached_get.c b/libmemcached/memcached_get.c index a2f7716d..f6c81338 100644 --- a/libmemcached/memcached_get.c +++ b/libmemcached/memcached_get.c @@ -180,6 +180,17 @@ memcached_return memcached_mget_by_key(memcached_st *ptr, WATCHPOINT_ASSERT(ptr->hosts[server_key].cursor_active == 1); } + /* Only called when we have a prefix key */ + if (ptr->prefix_key[0] != 0) + { + if ((memcached_io_write(&ptr->hosts[server_key], ptr->prefix_key, ptr->prefix_key_length, 0)) == -1) + { + memcached_server_response_reset(&ptr->hosts[server_key]); + rc= MEMCACHED_SOME_ERRORS; + continue; + } + } + if ((memcached_io_write(&ptr->hosts[server_key], keys[x], key_length[x], 0)) == -1) { memcached_server_response_reset(&ptr->hosts[server_key]); diff --git a/libmemcached/memcached_storage.c b/libmemcached/memcached_storage.c index 8f04c528..7dcc9b7a 100644 --- a/libmemcached/memcached_storage.c +++ b/libmemcached/memcached_storage.c @@ -72,13 +72,15 @@ static inline memcached_return memcached_send(memcached_st *ptr, if (cas) write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "%s %.*s %u %llu %zu %llu\r\n", storage_op_string(verb), + "%s %s%.*s %u %llu %zu %llu\r\n", storage_op_string(verb), + ptr->prefix_key, (int)key_length, key, flags, (unsigned long long)expiration, value_length, (unsigned long long)cas); else write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "%s %.*s %u %llu %zu\r\n", storage_op_string(verb), + "%s %s%.*s %u %llu %zu\r\n", storage_op_string(verb), + ptr->prefix_key, (int)key_length, key, flags, (unsigned long long)expiration, value_length); diff --git a/tests/function.c b/tests/function.c index d3d23e47..5e371537 100644 --- a/tests/function.c +++ b/tests/function.c @@ -633,7 +633,7 @@ test_return read_through(memcached_st *memc) return 0; } -memcached_return delete_trigger(memcached_st *ptr, char *key, size_t key_length) +memcached_return delete_trigger(memcached_st *ptr, const char *key, size_t key_length) { assert(key); @@ -2463,6 +2463,42 @@ void *my_realloc(memcached_st *ptr, void *mem, const size_t size) return realloc(mem, size); } +memcached_return set_prefix(memcached_st *memc) +{ + memcached_return rc; + const char *key= "mine"; + char *value; + + /* Make sure be default none exists */ + value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc); + assert(rc == MEMCACHED_FAILURE); + + /* Test a clean set */ + rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)key); + assert(rc == MEMCACHED_SUCCESS); + + value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc); + assert(memcmp(value, key, 4) == 0); + assert(rc == MEMCACHED_SUCCESS); + + /* Test that we can turn it off */ + rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, NULL); + assert(rc == MEMCACHED_SUCCESS); + + value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc); + assert(rc == MEMCACHED_FAILURE); + + /* Now setup for main test */ + rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)key); + assert(rc == MEMCACHED_SUCCESS); + + value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc); + assert(rc == MEMCACHED_SUCCESS); + assert(memcmp(value, key, 4) == 0); + + return MEMCACHED_SUCCESS; +} + memcached_return set_memory_alloc(memcached_st *memc) { { @@ -2758,6 +2794,7 @@ collection_st collection[] ={ {"consistent", enable_consistent, 0, tests}, {"wheel", enable_wheel, 0, tests}, {"memory_allocators", set_memory_alloc, 0, tests}, + {"prefix", set_prefix, 0, tests}, // {"udp", pre_udp, 0, tests}, {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3}, {"string", 0, 0, string_tests}, -- 2.30.2 From 2bb5c4d8d0b27380e1f0c1240581ddb592fdb577 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 20 May 2008 18:46:07 -0700 Subject: [PATCH 11/16] Found issue with rollback for clone operation with prefix key. --- libmemcached/memcached.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libmemcached/memcached.c b/libmemcached/memcached.c index 74e75706..f6d71d59 100644 --- a/libmemcached/memcached.c +++ b/libmemcached/memcached.c @@ -122,7 +122,10 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr) new_clone->delete_trigger= ptr->delete_trigger; if (ptr->prefix_key[0] != 0) + { strcpy(new_clone->prefix_key, ptr->prefix_key); + new_clone->prefix_key_length= ptr->prefix_key_length; + } rc= run_distribution(new_clone); if (rc != MEMCACHED_SUCCESS) -- 2.30.2 From 1622d8b5d30bb6e8bb7f0a0612fda0bc79cb27cf Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 20 May 2008 18:49:02 -0700 Subject: [PATCH 12/16] Fix for bootstrap env --- config/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/bootstrap b/config/bootstrap index cc463d86..74d9fa1d 100755 --- a/config/bootstrap +++ b/config/bootstrap @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash # Taken from lighthttpd server (BSD). Thanks Jan! # Run this to generate all the initial makefiles, etc. -- 2.30.2 From 3ea23a27300064df2ed982045ae0036bbe6a12cf Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 20 May 2008 18:51:52 -0700 Subject: [PATCH 13/16] Updated headers for version 21 --- configure.ac | 2 +- libmemcached/memcached.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index ce8b576b..3352a30b 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ MEMCACHED_LIBRARY_NAME=libmemcached #release versioning MEMCACHED_MAJOR_VERSION=0 -MEMCACHED_MINOR_VERSION=20 +MEMCACHED_MINOR_VERSION=21 MEMCACHED_MICRO_VERSION=0 #API version diff --git a/libmemcached/memcached.h b/libmemcached/memcached.h index e753dc65..4c0a4207 100644 --- a/libmemcached/memcached.h +++ b/libmemcached/memcached.h @@ -37,7 +37,7 @@ struct memcached_continuum_item_st { uint32_t value; }; -#define LIBMEMCACHED_VERSION_STRING "0.20" +#define LIBMEMCACHED_VERSION_STRING "0.21" struct memcached_stat_st { uint32_t pid; -- 2.30.2 From 7f50da6ed2f30cc137b51415edc64810ef84c69a Mon Sep 17 00:00:00 2001 From: Date: Wed, 21 May 2008 23:30:15 +0900 Subject: [PATCH 14/16] Fixed semi colon bug in memcp. --- ChangeLog | 1 + clients/memcp.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4f3bffb5..7c95c16c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Change of char * to const char * for all key based functions. * New MEMCACHED_CALLBACK_PREFIX_KEY added. You can now create domains for values. + * Fixed bug introducd in last version on memcp 0.20 Mon May 5 08:34:26 PDT 2008 * New consistent distribution tests. diff --git a/clients/memcp.c b/clients/memcp.c index 5b80fd64..cf06a573 100644 --- a/clients/memcp.c +++ b/clients/memcp.c @@ -106,7 +106,7 @@ int main(int argc, char *argv[]) exit(1); } - if (read_length != sbuf.st_size); + if (read_length != sbuf.st_size) { fprintf(stderr, "Failure reading from file\n"); exit(1); -- 2.30.2 From 91e5a2590a918ee7718023d99cc23692d5b2da23 Mon Sep 17 00:00:00 2001 From: Date: Wed, 21 May 2008 23:49:54 +0900 Subject: [PATCH 15/16] Fix for death of file io to call shutdown() --- ChangeLog | 1 + libmemcached/memcached_get.c | 24 +++++++++++++++--------- libmemcached/memcached_io.c | 9 +++++++-- libmemcached/memcached_io.h | 2 +- libmemcached/memcached_quit.c | 7 ++----- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7c95c16c..e533985c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * New MEMCACHED_CALLBACK_PREFIX_KEY added. You can now create domains for values. * Fixed bug introducd in last version on memcp + * Fix for death of file io to call shutdown() 0.20 Mon May 5 08:34:26 PDT 2008 * New consistent distribution tests. diff --git a/libmemcached/memcached_get.c b/libmemcached/memcached_get.c index f6c81338..34fcb4ea 100644 --- a/libmemcached/memcached_get.c +++ b/libmemcached/memcached_get.c @@ -51,22 +51,28 @@ char *memcached_get_by_key(memcached_st *ptr, /* On all failure drop to returning NULL */ if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED) { - uint8_t latch; /* We use latch to track the state of the original socket */ - if (rc == MEMCACHED_BUFFERED) { + uint8_t latch; /* We use latch to track the state of the original socket */ latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS); if (latch == 0) memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1); - } - rc= memcached_set(ptr, key, key_length, - memcached_result_value(&ptr->result), - memcached_result_length(&ptr->result), - 0, memcached_result_flags(&ptr->result)); + rc= memcached_set(ptr, key, key_length, + memcached_result_value(&ptr->result), + memcached_result_length(&ptr->result), + 0, memcached_result_flags(&ptr->result)); - if (rc == MEMCACHED_BUFFERED && latch == 0) - memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0); + if (rc == MEMCACHED_BUFFERED && latch == 0) + memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0); + } + else + { + rc= memcached_set(ptr, key, key_length, + memcached_result_value(&ptr->result), + memcached_result_length(&ptr->result), + 0, memcached_result_flags(&ptr->result)); + } if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED) { diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c index 38544102..93ca4173 100644 --- a/libmemcached/memcached_io.c +++ b/libmemcached/memcached_io.c @@ -204,9 +204,14 @@ ssize_t memcached_io_write(memcached_server_st *ptr, return original_length; } -memcached_return memcached_io_close(memcached_server_st *ptr) +memcached_return memcached_io_close(memcached_server_st *ptr, uint8_t io_death) { - close(ptr->fd); + /* in case of death shutdown to avoid blocking at close() */ + + if (io_death) + shutdown(ptr->fd, SHUT_RDWR); + else + close(ptr->fd); return MEMCACHED_SUCCESS; } diff --git a/libmemcached/memcached_io.h b/libmemcached/memcached_io.h index 887f5200..f7a72574 100644 --- a/libmemcached/memcached_io.h +++ b/libmemcached/memcached_io.h @@ -6,4 +6,4 @@ ssize_t memcached_io_write(memcached_server_st *ptr, void memcached_io_reset(memcached_server_st *ptr); ssize_t memcached_io_read(memcached_server_st *ptr, char *buffer, size_t length); -memcached_return memcached_io_close(memcached_server_st *ptr); +memcached_return memcached_io_close(memcached_server_st *ptr, uint8_t io_death); diff --git a/libmemcached/memcached_quit.c b/libmemcached/memcached_quit.c index b764cd1b..9749b848 100644 --- a/libmemcached/memcached_quit.c +++ b/libmemcached/memcached_quit.c @@ -29,12 +29,9 @@ void memcached_quit_server(memcached_server_st *ptr, uint8_t io_death) */ while ((read_length= memcached_io_read(ptr, buffer, sizeof(buffer)/sizeof(*buffer))) - > 0) - { - ; - } + > 0); } - memcached_io_close(ptr); + memcached_io_close(ptr, io_death); ptr->fd= -1; ptr->write_buffer_offset= 0; -- 2.30.2 From 66148d9fea42699de40be4e613b899bd7689c00b Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Fri, 23 May 2008 18:47:22 -0700 Subject: [PATCH 16/16] Tagging version 0.21 for release --- ChangeLog | 2 +- support/libmemcached.spec.in | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e533985c..54646863 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -0.21 +0.21 Fri May 23 18:34:09 PDT 2008 * Change of char * to const char * for all key based functions. * New MEMCACHED_CALLBACK_PREFIX_KEY added. You can now create domains for values. diff --git a/support/libmemcached.spec.in b/support/libmemcached.spec.in index 09ecebdc..6a09d1bb 100644 --- a/support/libmemcached.spec.in +++ b/support/libmemcached.spec.in @@ -54,6 +54,7 @@ memerror - Creates human readable messages from libmemecached error codes. %{_includedir}/libmemcached/memcached.hh %{_includedir}/libmemcached/libmemcached_config.h %{_includedir}/libmemcached/memcached_constants.h +%{_includedir}/libmemcached/memcached_get.h %{_includedir}/libmemcached/memcached_result.h %{_includedir}/libmemcached/memcached_server.h %{_includedir}/libmemcached/memcached_storage.h -- 2.30.2