From 95494802800a78d0ab84db3cb67aedc6a112b951 Mon Sep 17 00:00:00 2001 From: Date: Wed, 5 Dec 2007 07:11:04 +0900 Subject: [PATCH 1/1] First push (no docs) on range by key request by Dormondo. With this patch you can now group keys to particular sets of servers. --- ChangeLog | 2 + include/memcached.h | 55 +++++++++++++++++++ lib/memcached_get.c | 35 +++++++++++- lib/memcached_storage.c | 118 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 197 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb53ed89..3875e7e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ * 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. 0.11 Mon Nov 26 01:05:52 PST 2007 * Added option to memcache_behavior_set() so that poll() can be timed out. diff --git a/include/memcached.h b/include/memcached.h index c4871027..2b448081 100644 --- a/include/memcached.h +++ b/include/memcached.h @@ -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, diff --git a/lib/memcached_get.c b/lib/memcached_get.c index 598767f8..087e4960 100644 --- a/lib/memcached_get.c +++ b/lib/memcached_get.c @@ -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) { diff --git a/lib/memcached_storage.c b/lib/memcached_storage.c index ba8835cb..43a18a98 100644 --- a/lib/memcached_storage.c +++ b/lib/memcached_storage.c @@ -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; } -- 2.30.2