value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS);
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, value + 1);
assert((value + 1) == memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS));
- return 0;
+ return TEST_SUCCESS;
}
-static test_return fetch_all_results(memcached_st *memc) {
- memcached_return rc;
++static test_return fetch_all_results(memcached_st *memc)
++{
++ memcached_return rc= MEMCACHED_SUCCESS;
+ char return_key[MEMCACHED_MAX_KEY];
+ size_t return_key_length;
+ char *return_value;
+ size_t return_value_length;
+ uint32_t flags;
+
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
+ &return_value_length, &flags, &rc)))
+ {
+ assert(return_value);
+ assert(rc == MEMCACHED_SUCCESS);
+ free(return_value);
+ }
- return (rc == MEMCACHED_END) ? TEST_SUCCESS : TEST_FAILURE;
++
++ return ((rc == MEMCACHED_END) || (rc == MEMCACHED_SUCCESS)) ? TEST_SUCCESS : TEST_FAILURE;
+ }
+
/* Test case provided by Cal Haldenbrand */
static test_return user_supplied_bug1(memcached_st *memc)
{
memcached_server_list_free(server_pool);
memcached_free(memc);
- return 0;
+ return TEST_SUCCESS;
}
- assert(memc);
+ /* Large mget() of missing keys with binary proto
+ *
+ * If many binary quiet commands (such as getq's in an mget) fill the output
+ * buffer and the server chooses not to respond, memcached_flush hangs. See
+ * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
+ */
+
+ void fail(int); /* sighandler_t function that always asserts false */
+
+ static test_return _user_supplied_bug21(memcached_st* memc, size_t key_count)
+ {
+ memcached_return rc;
+ unsigned int x;
+ char **keys;
+ size_t* key_lengths;
+ void (*oldalarm)(int);
+ memcached_st *memc_clone;
+
+ memc_clone= memcached_clone(NULL, memc);
- memcached_free(memc);
++ assert(memc_clone);
+
+ /* only binproto uses getq for mget */
+ memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
+
+ /* empty the cache to ensure misses (hence non-responses) */
+ rc= memcached_flush(memc_clone, 0);
+ assert(rc == MEMCACHED_SUCCESS);
+
+ key_lengths= calloc(key_count, sizeof(size_t));
+ keys= calloc(key_count, sizeof(char *));
+ assert(keys);
+ for (x= 0; x < key_count; x++)
+ {
+ char buffer[30];
+
+ snprintf(buffer, 30, "%u", x);
+ keys[x]= strdup(buffer);
+ key_lengths[x]= strlen(keys[x]);
+ }
+
+ oldalarm= signal(SIGALRM, fail);
+ alarm(5);
+
+ rc= memcached_mget(memc_clone, (const char **)keys, key_lengths, key_count);
+ assert(rc == MEMCACHED_SUCCESS);
+
+ alarm(0);
+ signal(SIGALRM, oldalarm);
+
+ assert(fetch_all_results(memc) == TEST_SUCCESS);
+
+ for (x= 0; x < key_count; x++)
+ free(keys[x]);
+ free(keys);
+ free(key_lengths);
+
-static test_return user_supplied_bug21(memcached_st *memc)
++ memcached_free(memc_clone);
+
+ return TEST_SUCCESS;
+ }
+
++static test_return user_supplied_bug21(memcached_st *memc)
+ {
+ memcached_return rc;
+
+ /* should work as of r580 */
+ rc= _user_supplied_bug21(memc, 10);
+ assert(rc == TEST_SUCCESS);
+
+ /* should fail as of r580 */
+ rc= _user_supplied_bug21(memc, 1000);
+ assert(rc == TEST_SUCCESS);
+
+ return TEST_SUCCESS;
+ }
+
+ void fail(int unused __attribute__((unused)))
+ {
+ assert(0);
+ }
+
static test_return auto_eject_hosts(memcached_st *trash)
{
(void) trash;
free(return_value);
}
}
-- fprintf(stderr, "\t%u -> %u", global_count, count);
}
memcached_free(memc_clone);
rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
assert(rc == MEMCACHED_SUCCESS);
- /* Turn this into a help function */
- {
- char return_key[MEMCACHED_MAX_KEY];
- size_t return_key_length;
- char *return_value;
- size_t return_value_length;
- uint32_t flags;
-
- while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
- &return_value_length, &flags, &rc)))
- {
- assert(return_value);
- assert(rc == MEMCACHED_SUCCESS);
- free(return_value);
- }
- }
+ assert(fetch_all_results(memc) == TEST_SUCCESS);
- return 0;
+ return TEST_SUCCESS;
}
static test_return mget_read_result(memcached_st *memc)
{"user_supplied_bug18", 1, user_supplied_bug18 },
{"user_supplied_bug19", 1, user_supplied_bug19 },
{"user_supplied_bug20", 1, user_supplied_bug20 },
- {"user_supplied_bug21", 0, user_supplied_bug21 },
++ {"user_supplied_bug21", 1, user_supplied_bug21 },
{0, 0, 0}
};