libmemcached: fix #13
authorMichael Wallner <mike@php.net>
Tue, 21 Jan 2020 12:04:56 +0000 (13:04 +0100)
committerMichael Wallner <mike@php.net>
Tue, 21 Jan 2020 12:04:56 +0000 (13:04 +0100)
reset continuum counters after freeing them

libmemcached/memcached.cc
tests/libmemcached-1.0/all_tests.h
tests/libmemcached-1.0/server_add.cc
tests/libmemcached-1.0/setup_and_teardowns.cc
tests/libmemcached-1.0/setup_and_teardowns.h
tests/server_add.h

index 337f918dbbe498a20acafe53b6604d1561c6665a..6e88c257d1c79a0cf7735f8f471cfc6e524c8623 100644 (file)
@@ -285,6 +285,8 @@ void memcached_servers_reset(memcached_st *shell)
   {
     libmemcached_free(self, self->ketama.continuum);
     self->ketama.continuum= NULL;
+    self->ketama.continuum_count= 0;
+    self->ketama.continuum_points_counter= 0;
 
     memcached_instance_list_free(memcached_instance_list(self), self->number_of_hosts);
     memcached_instance_set(self, NULL, 0);
index b4abe9dde7e3fe43df781066f8e6431ff0e3b62f..3552f3dce333a8dc8eeadca97fa7b83ba23a6a52 100644 (file)
@@ -413,6 +413,7 @@ test_st memcached_server_add_TESTS[] ={
   {"memcached_server_add(NULL)", false, (test_callback_fn*)memcached_server_add_null_test },
   {"memcached_server_add(many)", false, (test_callback_fn*)memcached_server_many_TEST },
   {"memcached_server_add(many weighted)", false, (test_callback_fn*)memcached_server_many_weighted_TEST },
+  {"memcached_servers_reset(\"\")", false, (test_callback_fn*)memcached_servers_reset_test},
   {0, 0, (test_callback_fn*)0}
 };
 
@@ -452,6 +453,7 @@ collection_st collection[] ={
   {"hsieh_availability", 0, 0, hsieh_availability},
   {"murmur_availability", 0, 0, murmur_availability},
   {"memcached_server_add", (test_callback_fn*)memcached_servers_reset_SETUP, 0, memcached_server_add_TESTS},
+  {"memcached_server_add(continuum)", (test_callback_fn*)memcached_servers_reset_CONTINUUM, 0, memcached_server_add_TESTS},
   {"memcached_server_add(MEMCACHED_DISTRIBUTION_CONSISTENT)", (test_callback_fn*)memcached_servers_reset_MEMCACHED_DISTRIBUTION_CONSISTENT_SETUP, 0, memcached_server_add_TESTS},
   {"memcached_server_add(MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED)", (test_callback_fn*)memcached_servers_reset_MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED_SETUP, 0, memcached_server_add_TESTS},
   {"block", 0, 0, tests},
index 3747094770cdb49ea16ae552107b4ac399774424..49eb8448977e5e8fc35a61fdf93127147785b0da 100644 (file)
@@ -102,3 +102,17 @@ test_return_t memcached_server_many_weighted_TEST(memcached_st* memc)
 
   return TEST_SUCCESS;
 }
+
+test_return_t memcached_servers_reset_test(memcached_st* memc)
+{
+  ASSERT_EQ(0, memcached_server_count(memc));
+
+  test_compare(MEMCACHED_SUCCESS, memcached_server_add(memc, "localhost", 11511));
+
+  memcached_servers_reset(memc);
+
+  test_compare(MEMCACHED_SUCCESS, memcached_server_add(memc, "localhost", 11511));
+
+  return TEST_SUCCESS;
+}
+
index 4191c384a71c9f53394b21ff965f84b3b1e45c59..047497d69729d3130e27ae759f827b85df8256d7 100644 (file)
@@ -177,6 +177,16 @@ test_return_t memcached_servers_reset_SETUP(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+test_return_t memcached_servers_reset_CONTINUUM(memcached_st *memc)
+{
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, MEMCACHED_DISTRIBUTION_CONSISTENT);
+  memcached_servers_reset(memc);
+  test_zero(memc->ketama.continuum_count);
+  // If memc->ketama.continuum_count is non-zero at this point, any call to
+  // memcached_server_add will cause a segfault.
+  return TEST_SUCCESS;
+}
+
 test_return_t memcached_servers_reset_MEMCACHED_DISTRIBUTION_CONSISTENT_SETUP(memcached_st *memc)
 {
   test_compare(TEST_SUCCESS, memcached_servers_reset_SETUP(memc));
index 7610c5a600bbdc22f0806451c0c63462635bb84e..59b56f674028232d93bd8c8a8ff3e2be31a65c38 100644 (file)
@@ -64,3 +64,4 @@ test_return_t pre_buffer(memcached_st*);
 test_return_t memcached_servers_reset_MEMCACHED_DISTRIBUTION_CONSISTENT_SETUP(memcached_st *memc);
 test_return_t memcached_servers_reset_MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED_SETUP(memcached_st *memc);
 test_return_t memcached_servers_reset_SETUP(memcached_st *memc);
+test_return_t memcached_servers_reset_CONTINUUM(memcached_st *memc);
index 06d5835679df04ca7eaa45773a18d238c1091cbd..426571c4c7b81b5f0bf4795a659e4a3a4225f317 100644 (file)
@@ -41,3 +41,4 @@ test_return_t memcached_server_add_null_test(memcached_st*);
 test_return_t memcached_server_add_empty_test(memcached_st*);
 test_return_t memcached_server_many_TEST(memcached_st*);
 test_return_t memcached_server_many_weighted_TEST(memcached_st*);
+test_return_t memcached_servers_reset_test(memcached_st*);