X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fget.cc;h=86d8cf2e13522b625cf35f4acd8a1de23636e733;hb=88b1aa19c0b3c5ad047222618cb17f447ea2bc67;hp=88f8b56a1ed4285814c3248cbb47304cb8459d88;hpb=7acbb1495e0aaa29df7ffb09b90ec97fc949c48d;p=awesomized%2Flibmemcached diff --git a/libmemcached/get.cc b/libmemcached/get.cc index 88f8b56a..86d8cf2e 100644 --- a/libmemcached/get.cc +++ b/libmemcached/get.cc @@ -2,7 +2,7 @@ * * Libmemcached library * - * Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/ + * Copyright (C) 2011-2013 Data Differential, http://datadifferential.com/ * Copyright (C) 2006-2009 Brian Aker All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,15 +50,14 @@ char *memcached_get(memcached_st *ptr, const char *key, flags, error); } -static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, - const char *group_key, - size_t group_key_length, - const char * const *keys, - const size_t *key_length, - size_t number_of_keys, - bool mget_mode); - -char *memcached_get_by_key(memcached_st *ptr, +static memcached_return_t __mget_by_key_real(memcached_st *ptr, + const char *group_key, + size_t group_key_length, + const char * const *keys, + const size_t *key_length, + size_t number_of_keys, + const bool mget_mode); +char *memcached_get_by_key(memcached_st *shell, const char *group_key, size_t group_key_length, const char *key, size_t key_length, @@ -66,6 +65,7 @@ char *memcached_get_by_key(memcached_st *ptr, uint32_t *flags, memcached_return_t *error) { + Memcached* ptr= memcached2Memcached(shell); memcached_return_t unused; if (error == NULL) { @@ -79,9 +79,9 @@ char *memcached_get_by_key(memcached_st *ptr, } /* Request the key */ - *error= memcached_mget_by_key_real(ptr, group_key, group_key_length, - (const char * const *)&key, &key_length, - 1, false); + *error= __mget_by_key_real(ptr, group_key, group_key_length, + (const char * const *)&key, &key_length, + 1, false); if (ptr) { assert_msg(ptr->query_id == query_id +1, "Programmer error, the query_id was not incremented."); @@ -114,7 +114,6 @@ char *memcached_get_by_key(memcached_st *ptr, { *error= MEMCACHED_NOTFOUND; } - if (value == NULL) { if (ptr->get_key_failure and *error == MEMCACHED_NOTFOUND) @@ -186,20 +185,20 @@ memcached_return_t memcached_mget(memcached_st *ptr, } static memcached_return_t binary_mget_by_key(memcached_st *ptr, - uint32_t master_server_key, - bool is_group_key_set, + const uint32_t master_server_key, + const bool is_group_key_set, + const char * const *keys, + const size_t *key_length, + const size_t number_of_keys, + const bool mget_mode); + +static memcached_return_t __mget_by_key_real(memcached_st *ptr, + const char *group_key, + const size_t group_key_length, const char * const *keys, const size_t *key_length, size_t number_of_keys, - bool mget_mode); - -static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, - const char *group_key, - size_t group_key_length, - const char * const *keys, - const size_t *key_length, - size_t number_of_keys, - bool mget_mode) + const bool mget_mode) { bool failures_occured_in_sending= false; const char *get_command= "get"; @@ -221,12 +220,14 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, if (number_of_keys == 0) { - return memcached_set_error(*ptr, MEMCACHED_NOTFOUND, MEMCACHED_AT, memcached_literal_param("number_of_keys was zero")); + return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("Numbers of keys provided was zero")); } - if (memcached_failed(memcached_key_test(*ptr, keys, key_length, number_of_keys))) + if (memcached_failed((rc= memcached_key_test(*ptr, keys, key_length, number_of_keys)))) { - return memcached_last_error(ptr); + assert(memcached_last_error(ptr) == rc); + + return rc; } bool is_group_key_set= false; @@ -244,7 +245,7 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, */ for (uint32_t x= 0; x < memcached_server_count(ptr); x++) { - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, x); + memcached_instance_st* instance= memcached_instance_fetch(ptr, x); if (instance->response_count()) { @@ -293,7 +294,7 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]); } - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, server_key); + memcached_instance_st* instance= memcached_instance_fetch(ptr, server_key); libmemcached_io_vector_st vector[]= { @@ -315,7 +316,7 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, } hosts_connected++; - if ((memcached_io_writev(instance, vector, 4, false)) == false) + if ((memcached_io_writev(instance, vector, 1, false)) == false) { failures_occured_in_sending= true; continue; @@ -324,7 +325,7 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, memcached_instance_response_increment(instance); WATCHPOINT_ASSERT(instance->cursor_active_ == 1); } - else + { if ((memcached_io_writev(instance, (vector + 1), 3, false)) == false) { @@ -354,7 +355,7 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, bool success_happened= false; for (uint32_t x= 0; x < memcached_server_count(ptr); x++) { - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, x); + memcached_instance_st* instance= memcached_instance_fetch(ptr, x); if (instance->response_count()) { @@ -385,15 +386,15 @@ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr, return MEMCACHED_FAILURE; // Complete failure occurred } -memcached_return_t memcached_mget_by_key(memcached_st *ptr, +memcached_return_t memcached_mget_by_key(memcached_st *shell, const char *group_key, size_t group_key_length, const char * const *keys, const size_t *key_length, size_t number_of_keys) { - return memcached_mget_by_key_real(ptr, group_key, group_key_length, keys, - key_length, number_of_keys, true); + Memcached* ptr= memcached2Memcached(shell); + return __mget_by_key_real(ptr, group_key, group_key_length, keys, key_length, number_of_keys, true); } memcached_return_t memcached_mget_execute(memcached_st *ptr, @@ -409,7 +410,7 @@ memcached_return_t memcached_mget_execute(memcached_st *ptr, context, number_of_callbacks); } -memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr, +memcached_return_t memcached_mget_execute_by_key(memcached_st *shell, const char *group_key, size_t group_key_length, const char * const *keys, @@ -419,6 +420,7 @@ memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr, void *context, unsigned int number_of_callbacks) { + Memcached* ptr= memcached2Memcached(shell); memcached_return_t rc; if (memcached_failed(rc= initialize_query(ptr, false))) { @@ -447,20 +449,26 @@ memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr, rc= memcached_mget_by_key(ptr, group_key, group_key_length, keys, key_length, number_of_keys); ptr->callbacks= original_callbacks; + return rc; } static memcached_return_t simple_binary_mget(memcached_st *ptr, - uint32_t master_server_key, + const uint32_t master_server_key, bool is_group_key_set, const char * const *keys, const size_t *key_length, - size_t number_of_keys, bool mget_mode) + const size_t number_of_keys, const bool mget_mode) { memcached_return_t rc= MEMCACHED_NOTFOUND; bool flush= (number_of_keys == 1); + if (memcached_failed(rc= memcached_key_test(*ptr, keys, key_length, number_of_keys))) + { + return rc; + } + /* If a server fails we warn about errors and start all over with sending keys to the server. @@ -478,7 +486,7 @@ static memcached_return_t simple_binary_mget(memcached_st *ptr, server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]); } - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, server_key); + memcached_instance_st* instance= memcached_instance_fetch(ptr, server_key); if (instance->response_count() == 0) { @@ -500,18 +508,22 @@ static memcached_return_t simple_binary_mget(memcached_st *ptr, request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK; } - memcached_return_t vk; - vk= memcached_validate_key_length(key_length[x], - ptr->flags.binary_protocol); - if (vk != MEMCACHED_SUCCESS) +#if 0 { - if (x > 0) + memcached_return_t vk= memcached_validate_key_length(key_length[x], ptr->flags.binary_protocol); + if (memcached_failed(rc= memcached_key_test(*memc, (const char **)&key, &key_length, 1))) { - memcached_io_reset(instance); - } + memcached_set_error(ptr, vk, MEMCACHED_AT, memcached_literal_param("Key was too long.")); - return vk; + if (x > 0) + { + memcached_io_reset(instance); + } + + return vk; + } } +#endif request.message.header.request.keylen= htons((uint16_t)(key_length[x] + memcached_array_size(ptr->_namespace))); request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES; @@ -551,20 +563,13 @@ static memcached_return_t simple_binary_mget(memcached_st *ptr, for (uint32_t x= 0; x < memcached_server_count(ptr); ++x) { - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, x); - initialize_binary_request(instance, request.message.header); + memcached_instance_st* instance= memcached_instance_fetch(ptr, x); if (instance->response_count()) { - if (memcached_io_write(instance) == false) - { - memcached_instance_response_reset(instance); - memcached_io_reset(instance); - rc= MEMCACHED_SOME_ERRORS; - } - - if (memcached_io_write(instance, request.bytes, - sizeof(request.bytes), true) == -1) + initialize_binary_request(instance, request.message.header); + if ((memcached_io_write(instance) == false) or + (memcached_io_write(instance, request.bytes, sizeof(request.bytes), true) == -1)) { memcached_instance_response_reset(instance); memcached_io_reset(instance); @@ -574,7 +579,6 @@ static memcached_return_t simple_binary_mget(memcached_st *ptr, } } - return rc; } @@ -583,7 +587,7 @@ static memcached_return_t replication_binary_mget(memcached_st *ptr, bool* dead_servers, const char *const *keys, const size_t *key_length, - size_t number_of_keys) + const size_t number_of_keys) { memcached_return_t rc= MEMCACHED_NOTFOUND; uint32_t start= 0; @@ -602,9 +606,11 @@ static memcached_return_t replication_binary_mget(memcached_st *ptr, for (uint32_t x= 0; x < number_of_keys; ++x) { if (hash[x] == memcached_server_count(ptr)) + { continue; /* Already successfully sent */ + } - uint32_t server= hash[x] + replica; + uint32_t server= hash[x] +replica; /* In case of randomized reads */ if (randomize_read and ((server + start) <= (hash[x] + ptr->number_of_replicas))) @@ -622,7 +628,7 @@ static memcached_return_t replication_binary_mget(memcached_st *ptr, continue; } - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, server); + memcached_instance_st* instance= memcached_instance_fetch(ptr, server); if (instance->response_count() == 0) { @@ -683,12 +689,12 @@ static memcached_return_t replication_binary_mget(memcached_st *ptr, } static memcached_return_t binary_mget_by_key(memcached_st *ptr, - uint32_t master_server_key, + const uint32_t master_server_key, bool is_group_key_set, const char * const *keys, const size_t *key_length, - size_t number_of_keys, - bool mget_mode) + const size_t number_of_keys, + const bool mget_mode) { if (ptr->number_of_replicas == 0) {