X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=tests%2Ffunction.c;h=8728ccd421dd124993cd35f10b3c98c38a4dd542;hb=ef9ddf55563059fcf3608bab479e15f28e9ceb0f;hp=99ad776aecc1bc8154c4dc58cca229b885fd925c;hpb=20b4431225d4ccd4aa22f6d7f67476c92d1c9546;p=m6w6%2Flibmemcached diff --git a/tests/function.c b/tests/function.c index 99ad776a..8728ccd4 100644 --- a/tests/function.c +++ b/tests/function.c @@ -94,7 +94,7 @@ static test_return server_sort_test(memcached_st *ptr __attribute__((unused))) for (x= 0; x < TEST_PORT_COUNT; x++) { - test_ports[x]= random() % 64000; + test_ports[x]= (uint32_t)random() % 64000; rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0); assert(local_memc->number_of_hosts == x + 1); assert(local_memc->hosts[0].count == x+1); @@ -165,7 +165,7 @@ static test_return server_unsort_test(memcached_st *ptr __attribute__((unused)) for (x= 0; x < TEST_PORT_COUNT; x++) { - test_ports[x]= random() % 64000; + test_ports[x]= (uint32_t)(random() % 64000); rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0); assert(local_memc->number_of_hosts == x+1); assert(local_memc->hosts[0].count == x+1); @@ -200,64 +200,64 @@ static test_return clone_test(memcached_st *memc) { /* All null? */ { - memcached_st *clone; - clone= memcached_clone(NULL, NULL); - assert(clone); - memcached_free(clone); + memcached_st *memc_clone; + memc_clone= memcached_clone(NULL, NULL); + assert(memc_clone); + memcached_free(memc_clone); } /* Can we init from null? */ { - memcached_st *clone; - clone= memcached_clone(NULL, memc); - assert(clone); - - assert(clone->call_free == memc->call_free); - assert(clone->call_malloc == memc->call_malloc); - assert(clone->call_realloc == memc->call_realloc); - assert(clone->call_calloc == memc->call_calloc); - assert(clone->connect_timeout == memc->connect_timeout); - assert(clone->delete_trigger == memc->delete_trigger); - assert(clone->distribution == memc->distribution); - assert(clone->flags == memc->flags); - assert(clone->get_key_failure == memc->get_key_failure); - assert(clone->hash == memc->hash); - assert(clone->hash_continuum == memc->hash_continuum); - assert(clone->io_bytes_watermark == memc->io_bytes_watermark); - assert(clone->io_msg_watermark == memc->io_msg_watermark); - assert(clone->io_key_prefetch == memc->io_key_prefetch); - assert(clone->on_cleanup == memc->on_cleanup); - assert(clone->on_clone == memc->on_clone); - assert(clone->poll_timeout == memc->poll_timeout); - assert(clone->rcv_timeout == memc->rcv_timeout); - assert(clone->recv_size == memc->recv_size); - assert(clone->retry_timeout == memc->retry_timeout); - assert(clone->send_size == memc->send_size); - assert(clone->server_failure_limit == memc->server_failure_limit); - assert(clone->snd_timeout == memc->snd_timeout); - assert(clone->user_data == memc->user_data); - - memcached_free(clone); + memcached_st *memc_clone; + memc_clone= memcached_clone(NULL, memc); + assert(memc_clone); + + assert(memc_clone->call_free == memc->call_free); + assert(memc_clone->call_malloc == memc->call_malloc); + assert(memc_clone->call_realloc == memc->call_realloc); + assert(memc_clone->call_calloc == memc->call_calloc); + assert(memc_clone->connect_timeout == memc->connect_timeout); + assert(memc_clone->delete_trigger == memc->delete_trigger); + assert(memc_clone->distribution == memc->distribution); + assert(memc_clone->flags == memc->flags); + assert(memc_clone->get_key_failure == memc->get_key_failure); + assert(memc_clone->hash == memc->hash); + assert(memc_clone->hash_continuum == memc->hash_continuum); + assert(memc_clone->io_bytes_watermark == memc->io_bytes_watermark); + assert(memc_clone->io_msg_watermark == memc->io_msg_watermark); + assert(memc_clone->io_key_prefetch == memc->io_key_prefetch); + assert(memc_clone->on_cleanup == memc->on_cleanup); + assert(memc_clone->on_clone == memc->on_clone); + assert(memc_clone->poll_timeout == memc->poll_timeout); + assert(memc_clone->rcv_timeout == memc->rcv_timeout); + assert(memc_clone->recv_size == memc->recv_size); + assert(memc_clone->retry_timeout == memc->retry_timeout); + assert(memc_clone->send_size == memc->send_size); + assert(memc_clone->server_failure_limit == memc->server_failure_limit); + assert(memc_clone->snd_timeout == memc->snd_timeout); + assert(memc_clone->user_data == memc->user_data); + + memcached_free(memc_clone); } /* Can we init from struct? */ { memcached_st declared_clone; - memcached_st *clone; + memcached_st *memc_clone; memset(&declared_clone, 0 , sizeof(memcached_st)); - clone= memcached_clone(&declared_clone, NULL); - assert(clone); - memcached_free(clone); + memc_clone= memcached_clone(&declared_clone, NULL); + assert(memc_clone); + memcached_free(memc_clone); } /* Can we init from struct? */ { memcached_st declared_clone; - memcached_st *clone; + memcached_st *memc_clone; memset(&declared_clone, 0 , sizeof(memcached_st)); - clone= memcached_clone(&declared_clone, memc); - assert(clone); - memcached_free(clone); + memc_clone= memcached_clone(&declared_clone, memc); + assert(memc_clone); + memcached_free(memc_clone); } return 0; @@ -265,7 +265,7 @@ static test_return clone_test(memcached_st *memc) static test_return userdata_test(memcached_st *memc) { - void* foo; + void* foo= NULL; assert(memcached_set_user_data(memc, foo) == NULL); assert(memcached_get_user_data(memc) == foo); assert(memcached_set_user_data(memc, NULL) == foo); @@ -657,29 +657,29 @@ static test_return bad_key_test(memcached_st *memc) char *string; size_t string_length; uint32_t flags; - memcached_st *clone; + memcached_st *memc_clone; unsigned int set= 1; size_t max_keylen= 0xffff; - clone= memcached_clone(NULL, memc); - assert(clone); + memc_clone= memcached_clone(NULL, memc); + assert(memc_clone); - rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); + rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); assert(rc == MEMCACHED_SUCCESS); /* All keys are valid in the binary protocol (except for length) */ - if (memcached_behavior_get(clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 0) + if (memcached_behavior_get(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 0) { - string= memcached_get(clone, key, strlen(key), + string= memcached_get(memc_clone, key, strlen(key), &string_length, &flags, &rc); assert(rc == MEMCACHED_BAD_KEY_PROVIDED); assert(string_length == 0); assert(!string); set= 0; - rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); + rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); assert(rc == MEMCACHED_SUCCESS); - string= memcached_get(clone, key, strlen(key), + string= memcached_get(memc_clone, key, strlen(key), &string_length, &flags, &rc); assert(rc == MEMCACHED_NOTFOUND); assert(string_length == 0); @@ -689,13 +689,13 @@ static test_return bad_key_test(memcached_st *memc) char *keys[] = { "GoodKey", "Bad Key", "NotMine" }; size_t key_lengths[] = { 7, 7, 7 }; set= 1; - rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); + rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); assert(rc == MEMCACHED_SUCCESS); - rc= memcached_mget(clone, keys, key_lengths, 3); + rc= memcached_mget(memc_clone, keys, key_lengths, 3); assert(rc == MEMCACHED_BAD_KEY_PROVIDED); - rc= memcached_mget_by_key(clone, "foo daddy", 9, keys, key_lengths, 1); + rc= memcached_mget_by_key(memc_clone, "foo daddy", 9, keys, key_lengths, 1); assert(rc == MEMCACHED_BAD_KEY_PROVIDED); max_keylen= 250; @@ -704,20 +704,20 @@ static test_return bad_key_test(memcached_st *memc) memcached server is updated to allow max size length of the keys in the binary protocol */ - rc= memcached_callback_set(clone, MEMCACHED_CALLBACK_PREFIX_KEY, NULL); + rc= memcached_callback_set(memc_clone, MEMCACHED_CALLBACK_PREFIX_KEY, NULL); assert(rc == MEMCACHED_SUCCESS); char *longkey= malloc(max_keylen + 1); if (longkey != NULL) { memset(longkey, 'a', max_keylen + 1); - string= memcached_get(clone, longkey, max_keylen, + string= memcached_get(memc_clone, longkey, max_keylen, &string_length, &flags, &rc); assert(rc == MEMCACHED_NOTFOUND); assert(string_length == 0); assert(!string); - string= memcached_get(clone, longkey, max_keylen + 1, + string= memcached_get(memc_clone, longkey, max_keylen + 1, &string_length, &flags, &rc); assert(rc == MEMCACHED_BAD_KEY_PROVIDED); assert(string_length == 0); @@ -729,15 +729,15 @@ static test_return bad_key_test(memcached_st *memc) /* Make sure zero length keys are marked as bad */ set= 1; - rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); + rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set); assert(rc == MEMCACHED_SUCCESS); - string= memcached_get(clone, key, 0, + string= memcached_get(memc_clone, key, 0, &string_length, &flags, &rc); assert(rc == MEMCACHED_BAD_KEY_PROVIDED); assert(string_length == 0); assert(!string); - memcached_free(clone); + memcached_free(memc_clone); return 0; } @@ -1035,8 +1035,8 @@ static test_return get_test5(memcached_st *memc) static test_return stats_servername_test(memcached_st *memc) { memcached_return rc; - memcached_stat_st stat; - rc= memcached_stat_servername(&stat, NULL, + memcached_stat_st memc_stat; + rc= memcached_stat_servername(&memc_stat, NULL, memc->hosts[0].hostname, memc->hosts[0].port); @@ -1366,10 +1366,10 @@ static test_return get_stats_keys(memcached_st *memc) { char **list; char **ptr; - memcached_stat_st stat; + memcached_stat_st memc_stat; memcached_return rc; - list= memcached_stat_get_keys(memc, &stat, &rc); + list= memcached_stat_get_keys(memc, &memc_stat, &rc); assert(rc == MEMCACHED_SUCCESS); for (ptr= list; *ptr; ptr++) assert(*ptr); @@ -1397,24 +1397,24 @@ static test_return get_stats(memcached_st *memc) char **list; char **ptr; memcached_return rc; - memcached_stat_st *stat; + memcached_stat_st *memc_stat; - stat= memcached_stat(memc, NULL, &rc); + memc_stat= memcached_stat(memc, NULL, &rc); assert(rc == MEMCACHED_SUCCESS); assert(rc == MEMCACHED_SUCCESS); - assert(stat); + assert(memc_stat); for (x= 0; x < memcached_server_count(memc); x++) { - list= memcached_stat_get_keys(memc, stat+x, &rc); + list= memcached_stat_get_keys(memc, memc_stat+x, &rc); assert(rc == MEMCACHED_SUCCESS); for (ptr= list; *ptr; ptr++); free(list); } - memcached_stat_free(NULL, stat); + memcached_stat_free(NULL, memc_stat); return 0; } @@ -1451,7 +1451,7 @@ static test_return add_host_test(memcached_st *memc) return 0; } -static memcached_return clone_test_callback(memcached_st *parent __attribute__((unused)), memcached_st *clone __attribute__((unused))) +static memcached_return clone_test_callback(memcached_st *parent __attribute__((unused)), memcached_st *memc_clone __attribute__((unused))) { return MEMCACHED_SUCCESS; } @@ -1552,6 +1552,9 @@ static test_return behavior_test(memcached_st *memc) value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE); assert(value > 0); + 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; } @@ -1581,12 +1584,12 @@ static test_return user_supplied_bug1(memcached_st *memc) { unsigned int j= 0; - size= (rand() % ( 5 * 1024 ) ) + 400; + size= (uint32_t)(rand() % ( 5 * 1024 ) ) + 400; memset(randomstuff, 0, 6 * 1024); assert(size < 6 * 1024); /* Being safe here */ for (j= 0 ; j < size ;j++) - randomstuff[j] = (char) (rand() % 26) + 97; + randomstuff[j] = (signed char) ((rand() % 26) + 97); total += size; sprintf(key, "%d", x); @@ -1798,7 +1801,7 @@ static test_return user_supplied_bug5(memcached_st *memc) char insert_data[VALUE_SIZE_BUG5]; for (x= 0; x < VALUE_SIZE_BUG5; x++) - insert_data[x]= rand(); + insert_data[x]= (signed char)rand(); memcached_flush(memc, 0); value= memcached_get(memc, keys[0], key_length[0], @@ -1856,7 +1859,7 @@ static test_return user_supplied_bug6(memcached_st *memc) char insert_data[VALUE_SIZE_BUG5]; for (x= 0; x < VALUE_SIZE_BUG5; x++) - insert_data[x]= rand(); + insert_data[x]= (signed char)rand(); memcached_flush(memc, 0); value= memcached_get(memc, keys[0], key_length[0], @@ -1910,7 +1913,7 @@ static test_return user_supplied_bug8(memcached_st *memc __attribute__((unused) { memcached_return rc; memcached_st *mine; - memcached_st *clone; + memcached_st *memc_clone; memcached_server_st *servers; char *server_list= "memcache1.memcache.bk.sapo.pt:11211, memcache1.memcache.bk.sapo.pt:11212, memcache1.memcache.bk.sapo.pt:11213, memcache1.memcache.bk.sapo.pt:11214, memcache2.memcache.bk.sapo.pt:11211, memcache2.memcache.bk.sapo.pt:11212, memcache2.memcache.bk.sapo.pt:11213, memcache2.memcache.bk.sapo.pt:11214"; @@ -1924,14 +1927,14 @@ static test_return user_supplied_bug8(memcached_st *memc __attribute__((unused) memcached_server_list_free(servers); assert(mine); - clone= memcached_clone(NULL, mine); + memc_clone= memcached_clone(NULL, mine); memcached_quit(mine); - memcached_quit(clone); + memcached_quit(memc_clone); memcached_free(mine); - memcached_free(clone); + memcached_free(memc_clone); return 0; } @@ -1951,7 +1954,7 @@ static test_return user_supplied_bug7(memcached_st *memc) char insert_data[VALUE_SIZE_BUG5]; for (x= 0; x < VALUE_SIZE_BUG5; x++) - insert_data[x]= rand(); + insert_data[x]= (signed char)rand(); memcached_flush(memc, 0); @@ -2032,7 +2035,7 @@ static test_return user_supplied_bug10(memcached_st *memc) char *value; size_t value_length= 512; unsigned int x; - int key_len= 3; + size_t key_len= 3; memcached_return rc; unsigned int set= 1; memcached_st *mclone= memcached_clone(NULL, memc); @@ -2041,7 +2044,8 @@ static test_return user_supplied_bug10(memcached_st *memc) 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, timeout); + memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, + (uint64_t)timeout); value = (char*)malloc(value_length * sizeof(char)); @@ -2074,7 +2078,7 @@ static test_return user_supplied_bug11(memcached_st *memc) char *value; size_t value_length= 512; unsigned int x; - int key_len= 3; + size_t key_len= 3; memcached_return rc; unsigned int set= 1; int32_t timeout; @@ -2083,7 +2087,8 @@ static test_return user_supplied_bug11(memcached_st *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, timeout); + memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, + (size_t)timeout); timeout= (int32_t)memcached_behavior_get(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT); @@ -2191,7 +2196,7 @@ static test_return user_supplied_bug13(memcached_st *memc) */ static test_return user_supplied_bug14(memcached_st *memc) { - int setter= 1; + size_t setter= 1; memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter); memcached_return rc; char *key= "foo"; @@ -2384,7 +2389,7 @@ static test_return user_supplied_bug20(memcached_st *memc) static test_return user_supplied_bug18(memcached_st *trash) { memcached_return rc; - int value; + uint64_t value; int x; memcached_server_st *server_pool; memcached_st *memc; @@ -2696,7 +2701,7 @@ static test_return generate_data_with_stats(memcached_st *memc) } static test_return generate_buffer_data(memcached_st *memc) { - int latch= 0; + size_t latch= 0; latch= 1; memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch); @@ -2709,12 +2714,12 @@ static test_return get_read_count(memcached_st *memc) { unsigned int x; memcached_return rc; - memcached_st *clone; + memcached_st *memc_clone; - clone= memcached_clone(NULL, memc); - assert(clone); + memc_clone= memcached_clone(NULL, memc); + assert(memc_clone); - memcached_server_add_with_weight(clone, "localhost", 6666, 0); + memcached_server_add_with_weight(memc_clone, "localhost", 6666, 0); { char *return_value; @@ -2724,7 +2729,7 @@ static test_return get_read_count(memcached_st *memc) for (x= count= 0; x < global_count; x++) { - return_value= memcached_get(clone, global_keys[x], global_keys_length[x], + return_value= memcached_get(memc_clone, global_keys[x], global_keys_length[x], &return_value_length, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { @@ -2736,7 +2741,7 @@ static test_return get_read_count(memcached_st *memc) fprintf(stderr, "\t%u -> %u", global_count, count); } - memcached_free(clone); + memcached_free(memc_clone); return 0; } @@ -2848,7 +2853,7 @@ static test_return delete_generate(memcached_st *memc) static test_return delete_buffer_generate(memcached_st *memc) { - int latch= 0; + size_t latch= 0; unsigned int x; latch= 1; @@ -2904,15 +2909,15 @@ static memcached_return pre_nonblock(memcached_st *memc) static memcached_return pre_nonblock_binary(memcached_st *memc) { memcached_return rc= MEMCACHED_FAILURE; - memcached_st *clone; + memcached_st *memc_clone; - clone= memcached_clone(NULL, memc); - assert(clone); + memc_clone= memcached_clone(NULL, memc); + assert(memc_clone); // The memcached_version needs to be done on a clone, because the server // will not toggle protocol on an connection. - memcached_version(clone); + memcached_version(memc_clone); - if (clone->hosts[0].major_version >= 1 && clone->hosts[0].minor_version > 2) + if (memc_clone->hosts[0].major_version >= 1 && memc_clone->hosts[0].minor_version > 2) { memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0); rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); @@ -2920,7 +2925,7 @@ static memcached_return pre_nonblock_binary(memcached_st *memc) assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1); } - memcached_free(clone); + memcached_free(memc_clone); return rc; } @@ -3028,22 +3033,40 @@ static memcached_return pre_behavior_ketama_weighted(memcached_st *memc) static memcached_return pre_binary(memcached_st *memc) { memcached_return rc= MEMCACHED_FAILURE; - memcached_st *clone; + memcached_st *memc_clone; - clone= memcached_clone(NULL, memc); - assert(clone); + memc_clone= memcached_clone(NULL, memc); + assert(memc_clone); // The memcached_version needs to be done on a clone, because the server // will not toggle protocol on an connection. - memcached_version(clone); + memcached_version(memc_clone); - if (clone->hosts[0].major_version >= 1 && clone->hosts[0].minor_version > 2) + if (memc_clone->hosts[0].major_version >= 1 && memc_clone->hosts[0].minor_version > 2) { rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); assert(rc == MEMCACHED_SUCCESS); assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1); } - memcached_free(clone); + memcached_free(memc_clone); + return rc; +} + +static memcached_return pre_replication(memcached_st *memc) +{ + memcached_return rc= MEMCACHED_FAILURE; + if (pre_binary(memc) == MEMCACHED_SUCCESS) + { + /* + * Make sure that we store the item on all servers + * (master + replicas == number of servers) + */ + rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, + memc->number_of_hosts - 1); + assert(rc == MEMCACHED_SUCCESS); + assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS) == memc->number_of_hosts - 1); + } + return rc; } @@ -3138,6 +3161,7 @@ static memcached_return set_prefix(memcached_st *memc) return MEMCACHED_SUCCESS; } +#ifdef MEMCACHED_ENABLE_DEPRECATED static memcached_return deprecated_set_memory_alloc(memcached_st *memc) { void *test_ptr= NULL; @@ -3182,6 +3206,7 @@ static memcached_return deprecated_set_memory_alloc(memcached_st *memc) } return MEMCACHED_SUCCESS; } +#endif static memcached_return set_memory_alloc(memcached_st *memc) { @@ -3289,13 +3314,13 @@ static memcached_return pre_settimer(memcached_st *memc) static memcached_return poll_timeout(memcached_st *memc) { - int32_t timeout; + size_t timeout; timeout= 100; memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout); - timeout= (int32_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT); + timeout= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT); assert(timeout == 100); @@ -3320,7 +3345,7 @@ static test_return noreply_test(memcached_st *memc) for (int x=0; x < 100; ++x) { char key[10]; - size_t len= sprintf(key, "%d", x); + size_t len= (size_t)sprintf(key, "%d", x); switch (count) { case 0: @@ -3338,6 +3363,9 @@ static test_return noreply_test(memcached_st *memc) case 4: ret=memcached_prepend(memc, key, len, key, len, 0, 0); break; + default: + assert(count); + break; } assert(ret == MEMCACHED_SUCCESS || ret == MEMCACHED_BUFFERED); } @@ -3349,7 +3377,7 @@ static test_return noreply_test(memcached_st *memc) */ int no_msg=0; for (uint32_t x=0; x < memc->number_of_hosts; ++x) - no_msg+=memc->hosts[x].cursor_active; + no_msg+=(int)(memc->hosts[x].cursor_active); assert(no_msg == 0); assert(memcached_flush_buffers(memc) == MEMCACHED_SUCCESS); @@ -3360,7 +3388,7 @@ static test_return noreply_test(memcached_st *memc) for (int x=0; x < 100; ++x) { char key[10]; - size_t len= sprintf(key, "%d", x); + size_t len= (size_t)sprintf(key, "%d", x); size_t length; uint32_t flags; char* value=memcached_get(memc, key, strlen(key), @@ -3380,6 +3408,9 @@ static test_return noreply_test(memcached_st *memc) case 4: assert(length == len * 3); break; + default: + assert(count); + break; } free(value); } @@ -3425,19 +3456,19 @@ static test_return noreply_test(memcached_st *memc) static test_return analyzer_test(memcached_st *memc) { memcached_return rc; - memcached_stat_st *stat; + memcached_stat_st *memc_stat; memcached_analysis_st *report; - stat= memcached_stat(memc, NULL, &rc); + memc_stat= memcached_stat(memc, NULL, &rc); assert(rc == MEMCACHED_SUCCESS); - assert(stat); + assert(memc_stat); - report= memcached_analyze(memc, stat, &rc); + report= memcached_analyze(memc, memc_stat, &rc); assert(rc == MEMCACHED_SUCCESS); assert(report); free(report); - memcached_stat_free(NULL, stat); + memcached_stat_free(NULL, memc_stat); return TEST_SUCCESS; } @@ -3542,6 +3573,179 @@ static test_return connection_pool_test(memcached_st *memc) } #endif +static test_return replication_set_test(memcached_st *memc) +{ + memcached_return rc; + memcached_st *clone= memcached_clone(NULL, memc); + memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0); + + rc= memcached_set(memc, "bubba", 5, "0", 1, 0, 0); + assert(rc == MEMCACHED_SUCCESS); + + /* + ** "bubba" should now be stored on all of our servers. We don't have an + ** easy to use API to address each individual server, so I'll just iterate + ** through a bunch of "master keys" and I should most likely hit all of the + ** servers... + */ + for (int x= 'a'; x <= 'z'; ++x) + { + char key[2]= { [0]= (char)x }; + size_t len; + uint32_t flags; + char *val= memcached_get_by_key(clone, key, 1, "bubba", 5, + &len, &flags, &rc); + assert(rc == MEMCACHED_SUCCESS); + assert(val != NULL); + free(val); + } + + memcached_free(clone); + + return TEST_SUCCESS; +} + +static test_return replication_get_test(memcached_st *memc) +{ + memcached_return rc; + + /* + * Don't do the following in your code. I am abusing the internal details + * within the library, and this is not a supported interface. + * This is to verify correct behavior in the library + */ + for (uint32_t host= 0; host < memc->number_of_hosts; ++host) + { + memcached_st *clone= memcached_clone(NULL, memc); + clone->hosts[host].port= 0; + + for (int x= 'a'; x <= 'z'; ++x) + { + char key[2]= { [0]= (char)x }; + size_t len; + uint32_t flags; + char *val= memcached_get_by_key(clone, key, 1, "bubba", 5, + &len, &flags, &rc); + assert(rc == MEMCACHED_SUCCESS); + assert(val != NULL); + free(val); + } + + memcached_free(clone); + } + + return TEST_SUCCESS; +} + +static test_return replication_mget_test(memcached_st *memc) +{ + memcached_return rc; + memcached_st *clone= memcached_clone(NULL, memc); + memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0); + + char *keys[]= { "bubba", "key1", "key2", "key3" }; + size_t len[]= { 5, 4, 4, 4 }; + + for (int x=0; x< 4; ++x) + { + rc= memcached_set(memc, keys[x], len[x], "0", 1, 0, 0); + assert(rc == MEMCACHED_SUCCESS); + } + + /* + * Don't do the following in your code. I am abusing the internal details + * within the library, and this is not a supported interface. + * This is to verify correct behavior in the library + */ + memcached_result_st result_obj; + for (uint32_t host= 0; host < clone->number_of_hosts; host++) + { + memcached_st *new_clone= memcached_clone(NULL, memc); + new_clone->hosts[host].port= 0; + + for (int x= 'a'; x <= 'z'; ++x) + { + char key[2]= { [0]= (char)x }; + + rc= memcached_mget_by_key(new_clone, key, 1, keys, len, 4); + assert(rc == MEMCACHED_SUCCESS); + + memcached_result_st *results= memcached_result_create(new_clone, &result_obj); + assert(results); + + int hits= 0; + while ((results= memcached_fetch_result(new_clone, &result_obj, &rc)) != NULL) + { + hits++; + } + assert(hits == 4); + memcached_result_free(&result_obj); + } + + memcached_free(new_clone); + } + + return TEST_SUCCESS; +} + +static test_return replication_delete_test(memcached_st *memc) +{ + memcached_return rc; + memcached_st *clone= memcached_clone(NULL, memc); + /* Delete the items from all of the servers except 1 */ + uint64_t repl= memcached_behavior_get(memc, + MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS); + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, --repl); + + char *keys[]= { "bubba", "key1", "key2", "key3" }; + size_t len[]= { 5, 4, 4, 4 }; + + for (int x=0; x< 4; ++x) + { + rc= memcached_delete_by_key(memc, keys[0], len[0], keys[x], len[x], 0); + assert(rc == MEMCACHED_SUCCESS); + } + + /* + * Don't do the following in your code. I am abusing the internal details + * within the library, and this is not a supported interface. + * This is to verify correct behavior in the library + */ + uint32_t hash= memcached_generate_hash(memc, keys[0], len[0]); + for (uint32_t x= 0; x < (repl + 1); ++x) + { + clone->hosts[hash].port= 0; + if (++hash == clone->number_of_hosts) + hash= 0; + } + + memcached_result_st result_obj; + for (uint32_t host= 0; host < clone->number_of_hosts; ++host) + { + for (int x= 'a'; x <= 'z'; ++x) + { + char key[2]= { [0]= (char)x }; + + rc= memcached_mget_by_key(clone, key, 1, keys, len, 4); + assert(rc == MEMCACHED_SUCCESS); + + memcached_result_st *results= memcached_result_create(clone, &result_obj); + assert(results); + + int hits= 0; + while ((results= memcached_fetch_result(clone, &result_obj, &rc)) != NULL) + { + ++hits; + } + assert(hits == 4); + memcached_result_free(&result_obj); + } + } + memcached_free(clone); + + return TEST_SUCCESS; +} + static void increment_request_id(uint16_t *id) { (*id)++; @@ -3554,6 +3758,7 @@ static uint16_t *get_udp_request_ids(memcached_st *memc) uint16_t *ids= malloc(sizeof(uint16_t) * memc->number_of_hosts); assert(ids != NULL); unsigned int x; + for (x= 0; x < memc->number_of_hosts; x++) ids[x]= get_udp_datagram_request_id((struct udp_datagram_header_st *) memc->hosts[x].write_buffer); @@ -3565,6 +3770,7 @@ static test_return post_udp_op_check(memcached_st *memc, uint16_t *expected_req_ unsigned int x; memcached_server_st *cur_server = memc->hosts; uint16_t *cur_req_ids = get_udp_request_ids(memc); + for (x= 0; x < memc->number_of_hosts; x++) { assert(cur_server[x].cursor_active == 0); @@ -3572,6 +3778,7 @@ static test_return post_udp_op_check(memcached_st *memc, uint16_t *expected_req_ } free(expected_req_ids); free(cur_req_ids); + return TEST_SUCCESS; } @@ -3593,6 +3800,7 @@ static memcached_return init_udp(memcached_st *memc) memcpy(servers, memc->hosts, sizeof(memcached_server_st) * num_hosts); for (x= 0; x < num_hosts; x++) memcached_server_free(&memc->hosts[x]); + memc->number_of_hosts= 0; memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, 1); for (x= 0; x < num_hosts; x++) @@ -3600,6 +3808,7 @@ static memcached_return init_udp(memcached_st *memc) assert(memcached_server_add_udp(memc, servers[x].hostname, servers[x].port) == MEMCACHED_SUCCESS); assert(memc->hosts[x].write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH); } + return MEMCACHED_SUCCESS; } @@ -4247,6 +4456,14 @@ test_st user_tests[] ={ {0, 0, 0} }; +test_st replication_tests[]= { + {"set", 1, replication_set_test }, + {"get", 0, replication_get_test }, + {"mget", 0, replication_mget_test }, + {"delete", 0, replication_delete_test }, + {0, 0, 0} +}; + test_st generate_tests[] ={ {"generate_pairs", 1, generate_pairs }, {"generate_data", 1, generate_data }, @@ -4330,7 +4547,9 @@ collection_st collection[] ={ {"poll_timeout", poll_timeout, 0, tests}, {"gets", enable_cas, 0, tests}, {"consistent", enable_consistent, 0, tests}, +#ifdef MEMCACHED_ENABLE_DEPRECATED {"deprecated_memory_allocators", deprecated_set_memory_alloc, 0, tests}, +#endif {"memory_allocators", set_memory_alloc, 0, tests}, {"prefix", set_prefix, 0, tests}, {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3}, @@ -4351,6 +4570,7 @@ collection_st collection[] ={ {"consistent_ketama", pre_behavior_ketama, 0, consistent_tests}, {"consistent_ketama_weighted", pre_behavior_ketama_weighted, 0, consistent_weighted_tests}, {"test_hashes", 0, 0, hash_tests}, + {"replication", pre_replication, 0, replication_tests}, {0, 0, 0, 0} };