static test_return_t user_supplied_bug10(memcached_st *memc)
{
const char *key= "foo";
- char *value;
size_t value_length= 512;
- unsigned int x;
size_t key_len= 3;
unsigned int set= 1;
memcached_st *mclone= memcached_clone(NULL, memc);
- int32_t timeout;
memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
- timeout= 2;
- memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
- (uint64_t)timeout);
+ int32_t timeout= 0;
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, (uint64_t)timeout);
- value = (char*)malloc(value_length * sizeof(char));
+ char *value= (char*)malloc(value_length * sizeof(char));
- for (x= 0; x < value_length; x++)
+ for (unsigned int x= 0; x < value_length; x++)
+ {
value[x]= (char) (x % 127);
+ }
- for (x= 1; x <= 100000; ++x)
+ for (unsigned int x= 1; x <= 100000; ++x)
{
memcached_return_t rc= memcached_set(mclone, key, key_len,value, value_length, 0, 0);
- test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_WRITE_FAILURE ||
- rc == MEMCACHED_BUFFERED || rc == MEMCACHED_TIMEOUT);
+ test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_WRITE_FAILURE or rc == MEMCACHED_BUFFERED or rc == MEMCACHED_TIMEOUT or rc == MEMCACHED_CONNECTION_FAILURE,
+ memcached_strerror(NULL, rc));
- if (rc == MEMCACHED_WRITE_FAILURE || rc == MEMCACHED_TIMEOUT)
+ if (rc == MEMCACHED_WRITE_FAILURE or rc == MEMCACHED_TIMEOUT)
+ {
x--;
+ }
}
free(value);
static test_return_t user_supplied_bug11(memcached_st *memc)
{
const char *key= "foo";
- char *value;
size_t value_length= 512;
- unsigned int x;
size_t key_len= 3;
- memcached_return_t rc;
unsigned int set= 1;
- int32_t timeout;
memcached_st *mclone= memcached_clone(NULL, memc);
memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
- timeout= -1;
- memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
- (size_t)timeout);
+ int32_t timeout= -1;
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, (size_t)timeout);
timeout= (int32_t)memcached_behavior_get(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
test_true(timeout == -1);
- value = (char*)malloc(value_length * sizeof(char));
+ char *value= (char*)malloc(value_length * sizeof(char));
- for (x= 0; x < value_length; x++)
+ for (unsigned int x= 0; x < value_length; x++)
+ {
value[x]= (char) (x % 127);
+ }
- for (x= 1; x <= 100000; ++x)
+ for (unsigned int x= 1; x <= 100000; ++x)
{
- rc= memcached_set(mclone, key, key_len,value, value_length, 0, 0);
+ memcached_return_t rc= memcached_set(mclone, key, key_len,value, value_length, 0, 0);
+ (void)rc;
}
free(value);
static test_return_t poll_timeout(memcached_st *memc)
{
- size_t timeout;
-
- timeout= 100;
+ size_t timeout= 100; // Not using, just checking that it sets
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout);
timeout= (size_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
- test_true(timeout == 100);
+ test_compare(100, timeout);
return TEST_SUCCESS;
}
return TEST_SUCCESS;
}
+#define regression_bug_655423_COUNT 6000
+static test_return_t regression_bug_655423(memcached_st *memc)
+{
+ memcached_st *clone= memcached_clone(NULL, memc);
+ memc= NULL; // Just to make sure it is not used
+ test_true(clone);
+ char payload[100];
+
+ test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1));
+ test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1));
+ test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1));
+ test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH, 1));
+
+ memset(payload, int('x'), sizeof(payload));
+
+ for (uint32_t x= 0; x < regression_bug_655423_COUNT; x++)
+ {
+ char key[1024];
+ snprintf(key, sizeof(key), "%u", x);
+
+ test_compare(MEMCACHED_SUCCESS, memcached_set(clone, key, strlen(key), payload, sizeof(payload), 0, 0));
+ }
+
+ for (uint32_t x= 0; x < regression_bug_655423_COUNT; x++)
+ {
+ char key[1024];
+ snprintf(key, sizeof(key), "%u", x);
+
+ size_t value_length;
+ memcached_return_t rc;
+ char *value= memcached_get(clone, key, strlen(key), &value_length, NULL, &rc);
+
+ if (rc == MEMCACHED_NOTFOUND)
+ {
+ test_false(value);
+ test_compare(0, value_length);
+ continue;
+ }
+
+ test_compare(MEMCACHED_SUCCESS, rc);
+ test_true(value);
+ test_compare(100, value_length);
+ free(value);
+ }
+
+ char **keys= (char**)calloc(regression_bug_655423_COUNT, sizeof(char*));
+ size_t *key_length= (size_t *)calloc(regression_bug_655423_COUNT, sizeof(size_t));
+ for (uint32_t x= 0; x < regression_bug_655423_COUNT; x++)
+ {
+ char key[1024];
+ snprintf(key, sizeof(key), "%u", x);
+
+ keys[x]= strdup(key);
+ key_length[x]= strlen(key);
+ }
+
+ memcached_return_t rc;
+ test_compare_got(MEMCACHED_SUCCESS,
+ rc= memcached_mget(clone, (const char* const *)keys, key_length, regression_bug_655423_COUNT),
+ memcached_strerror(NULL, rc));
+
+ uint32_t count= 0;
+ memcached_result_st *result= NULL;
+ while ((result= memcached_fetch_result(clone, result, NULL)))
+ {
+ test_compare(100, memcached_result_length(result));
+ count++;
+ }
+
+ test_true(count > 100); // If we don't get back atleast this, something is up
+
+ /* Release all allocated resources */
+ for (size_t x= 0; x < regression_bug_655423_COUNT; ++x)
+ {
+ free(keys[x]);
+ }
+ free(keys);
+ free(key_length);
+
+
+ memcached_free(clone);
+
+ return TEST_SUCCESS;
+}
+
static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
{
fprintf(stderr, "Iteration #%u: ", it);
{"lp:581030", 1, (test_callback_fn)regression_bug_581030 },
{"lp:71231153 connect()", 1, (test_callback_fn)regression_bug_71231153_connect },
{"lp:71231153 poll()", 1, (test_callback_fn)regression_bug_71231153_poll },
+ {"lp:655423", 1, (test_callback_fn)regression_bug_655423 },
{0, 0, (test_callback_fn)0}
};