Fixed bug where we might not see the right return type for the distribution type.
authorBrian Aker <brian@tangent.org>
Tue, 12 Jun 2012 21:33:31 +0000 (22:33 +0100)
committerBrian Aker <brian@tangent.org>
Tue, 12 Jun 2012 21:33:31 +0000 (22:33 +0100)
libmemcached/behavior.cc
libmemcached/io.cc
tests/libmemcached-1.0/mem_functions.cc
tests/libmemcached-1.0/setup_and_teardowns.cc

index c91acc5d8099099699284034e80ad525f2855202..fd096db24f5043cabceb7f2caae15f0b924205f5 100644 (file)
 #include <ctime>
 #include <sys/types.h>
 
+static bool __is_ketama(memcached_st *ptr)
+{
+  switch (ptr->distribution)
+  {
+  case MEMCACHED_DISTRIBUTION_CONSISTENT:
+  case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
+  case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY:
+  case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED:
+    return true;
+
+  case MEMCACHED_DISTRIBUTION_MODULA:
+  case MEMCACHED_DISTRIBUTION_RANDOM:
+  case MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET:
+  case MEMCACHED_DISTRIBUTION_CONSISTENT_MAX:
+    break;
+  }
+
+  return false;
+}
+
 /*
   This function is used to modify the behavior of running client.
 
@@ -335,13 +355,17 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
     return ptr->flags.verify_key;
 
   case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED:
-    return ptr->ketama.weighted;
+    if (__is_ketama(ptr))
+    {
+      return ptr->ketama.weighted;
+    }
+    return false;
 
   case MEMCACHED_BEHAVIOR_DISTRIBUTION:
     return ptr->distribution;
 
   case MEMCACHED_BEHAVIOR_KETAMA:
-    return (ptr->distribution == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA) ? (uint64_t) 1 : 0;
+    return __is_ketama(ptr);
 
   case MEMCACHED_BEHAVIOR_HASH:
     return hashkit_get_function(&ptr->hashkit);
@@ -519,6 +543,7 @@ memcached_return_t memcached_behavior_set_distribution(memcached_st *ptr, memcac
     return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
                                memcached_literal_param("Invalid memcached_server_distribution_t"));
   }
+  ptr->distribution= type;
 
   return run_distribution(ptr);
 }
index bafa28c818a45c16f7b8da226c638e08da793c07..c848b6318e5bd5f7e14960bd2be16028aaa2b5cb 100644 (file)
@@ -372,7 +372,7 @@ memcached_return_t memcached_io_wait_for_write(memcached_server_write_instance_s
   return io_wait(ptr, MEM_WRITE);
 }
 
-static memcached_return_t _io_fill(memcached_server_write_instance_st ptr, ssize_t& nread)
+static memcached_return_t _io_fill(memcached_server_write_instance_st ptr)
 {
   ssize_t data_read;
   do
@@ -415,12 +415,12 @@ static memcached_return_t _io_fill(memcached_server_write_instance_st ptr, ssize
       case EFAULT:
       case ECONNREFUSED:
       default:
-        {
-          memcached_quit_server(ptr, true);
-          nread= -1;
-          return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
-        }
+        memcached_quit_server(ptr, true);
+        memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
+        break;
       }
+
+      return memcached_server_error_return(ptr);
     }
     else if (data_read == 0)
     {
@@ -434,7 +434,6 @@ static memcached_return_t _io_fill(memcached_server_write_instance_st ptr, ssize
         it will return EGAIN if data is not immediatly available.
       */
       memcached_quit_server(ptr, true);
-      nread= -1;
       return memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT, 
                                  memcached_literal_param("::rec() returned zero, server has disconnected"));
     }
@@ -469,8 +468,9 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
     if (ptr->read_buffer_length == 0)
     {
       memcached_return_t io_fill_ret;
-      if (memcached_fatal(io_fill_ret= _io_fill(ptr, nread)))
+      if (memcached_fatal(io_fill_ret= _io_fill(ptr)))
       {
+        nread= -1;
         return io_fill_ret;
       }
     }
index ce0514d7319246f07ad7856259d0d5036aef7fe2..2f6d56f36ed56cef7bc94815c9efd8456b81d20e 100644 (file)
@@ -650,7 +650,7 @@ test_return_t memcached_mget_mixed_memcached_get_TEST(memcached_st *memc)
       { } // It is possible that the value has been purged.
       else
       {
-        test_compare_hint(MEMCACHED_SUCCESS, rc, memcached_last_error_message(memc));
+        test_compare(MEMCACHED_SUCCESS, rc);
       }
       test_null(out_value);
       test_zero(value_length);
@@ -1690,8 +1690,7 @@ test_return_t mget_execute(memcached_st *original_memc)
                                          keys.key_at(x), keys.length_at(x),
                                          blob, sizeof(blob),
                                          0, 0);
-    test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED,
-                  memcached_last_error_message(memc));
+    test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED);
     test_compare(query_id +1, memcached_query_id(memc));
   }
 
@@ -3067,20 +3066,21 @@ test_return_t set_memory_alloc(memcached_st *memc)
 
 test_return_t enable_consistent_crc(memcached_st *memc)
 {
+  test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, MEMCACHED_DISTRIBUTION_CONSISTENT));
+  test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION),  uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT));
+
   test_return_t rc;
-  memcached_server_distribution_t value= MEMCACHED_DISTRIBUTION_CONSISTENT;
-  memcached_hash_t hash;
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
   if ((rc= pre_crc(memc)) != TEST_SUCCESS)
+  {
     return rc;
+  }
 
-  value= (memcached_server_distribution_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
-  test_true(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
-
-  hash= (memcached_hash_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
+  test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION),  uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT));
 
-  if (hash != MEMCACHED_HASH_CRC)
+  if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH) != MEMCACHED_HASH_CRC)
+  {
     return TEST_SKIPPED;
+  }
 
   return TEST_SUCCESS;
 }
@@ -3088,22 +3088,18 @@ test_return_t enable_consistent_crc(memcached_st *memc)
 test_return_t enable_consistent_hsieh(memcached_st *memc)
 {
   test_return_t rc;
-  memcached_server_distribution_t value= MEMCACHED_DISTRIBUTION_CONSISTENT;
-  memcached_hash_t hash;
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, MEMCACHED_DISTRIBUTION_CONSISTENT);
   if ((rc= pre_hsieh(memc)) != TEST_SUCCESS)
   {
     return rc;
   }
 
-  value= (memcached_server_distribution_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
-  test_true(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
-
-  hash= (memcached_hash_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
+  test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION), uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT));
 
-  if (hash != MEMCACHED_HASH_HSIEH)
+  if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH) != MEMCACHED_HASH_HSIEH)
+  {
     return TEST_SKIPPED;
-
+  }
 
   return TEST_SUCCESS;
 }
@@ -3236,7 +3232,7 @@ test_return_t noreply_test(memcached_st *memc)
       {
         continue;
       }
-      test_true_hint(ret == MEMCACHED_SUCCESS and value != NULL, memcached_last_error_message(memc));
+      test_true(ret == MEMCACHED_SUCCESS and value != NULL);
       switch (count)
       {
       case 0: /* FALLTHROUGH */
index 3d6a4a08e62c6e6b2e5b417d28067e2034962c46..4e5c06163a41eaaee54162f571ecbac17ea63cd1 100644 (file)
@@ -172,11 +172,9 @@ test_return_t pre_hash_fnv1a_32(memcached_st *memc)
 
 test_return_t pre_behavior_ketama(memcached_st *memc)
 {
-  memcached_return_t rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA, 1);
-  test_compare(MEMCACHED_SUCCESS, rc);
+  test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA, 1));
 
-  uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA);
-  test_compare(value, uint64_t(1));
+  test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA), uint64_t(1));
 
   return TEST_SUCCESS;
 }