X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_get.c;h=087e4960f33355e3bf49ae93d2d85f6839c7355f;hb=3bd95102380ff8d9f2599f0965c09776344d0691;hp=aab225388b2425900824984a32524dac15dad2ef;hpb=758bc213bbf8e00c6f33903c1c845c69f39a1ab0;p=m6w6%2Flibmemcached diff --git a/lib/memcached_get.c b/lib/memcached_get.c index aab22538..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,11 +78,21 @@ 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. + */ for (x= 0; x < number_of_keys; x++) { 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) { @@ -67,7 +100,6 @@ memcached_return memcached_mget(memcached_st *ptr, if ((memcached_io_write(ptr, server_key, get_command, get_command_length, 0)) == -1) { - memcached_quit_server(ptr, server_key); rc= MEMCACHED_SOME_ERRORS; continue; } @@ -77,7 +109,6 @@ memcached_return memcached_mget(memcached_st *ptr, if ((memcached_io_write(ptr, server_key, keys[x], key_length[x], 0)) == -1) { ptr->hosts[server_key].cursor_active= 0; - memcached_quit_server(ptr, server_key); rc= MEMCACHED_SOME_ERRORS; continue; } @@ -85,7 +116,6 @@ memcached_return memcached_mget(memcached_st *ptr, if ((memcached_io_write(ptr, server_key, " ", 1, 0)) == -1) { ptr->hosts[server_key].cursor_active= 0; - memcached_quit_server(ptr, server_key); rc= MEMCACHED_SOME_ERRORS; continue; } @@ -101,7 +131,6 @@ memcached_return memcached_mget(memcached_st *ptr, /* We need to doo something about non-connnected hosts in the future */ if ((memcached_io_write(ptr, x, "\r\n", 2, 1)) == -1) { - memcached_quit_server(ptr, x); rc= MEMCACHED_SOME_ERRORS; } }