Merge lp:~mkoppanen/libmemcached/replication-miss-test into lp:~tangent-org/libmemcached/trunk

Proposed by mikko
Status: Needs review
Proposed branch: lp:~mkoppanen/libmemcached/replication-miss-test
Merge into: lp:~tangent-org/libmemcached/trunk
Diff against target: 78 lines (+61/-0)
1 file modified
tests/mem_functions.c (+61/-0)
To merge this branch: bzr merge lp:~mkoppanen/libmemcached/replication-miss-test
Reviewer Review Type Date Requested Status
Libmemcached-developers Pending
Review via email: mp+19058@code.launchpad.net
To post a comment you must log in.
Revision history for this message
mikko (mkoppanen) wrote :

Hi, here is a test for replication misses. The comments should explain it but if you have issues let me know

Unmerged revisions

778. By Mikko Koppanen <email address hidden>

added test

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/mem_functions.c'
2--- tests/mem_functions.c 2010-01-22 22:41:53 +0000
3+++ tests/mem_functions.c 2010-02-10 21:56:15 +0000
4@@ -4439,6 +4439,66 @@
5 return TEST_SUCCESS;
6 }
7
8+/* Test that single miss does not cause replica reads to fail */
9+static test_return_t replication_miss_test(memcached_st *memc)
10+{
11+ memcached_return_t rc;
12+ memcached_st *memc_repl= memcached_clone(NULL, memc);
13+ memcached_st *memc_single= memcached_clone(NULL, memc);
14+
15+ char *v;
16+ const char *key = "hello_w_k";
17+ const char *value = "my_value";
18+ size_t vlen;
19+ uint32_t flags;
20+
21+ /* this test makes sense only with 2 or more servers */
22+ test_true(memcached_server_count(memc_repl) > 1);
23+
24+ /* Consistent hash */
25+ memcached_behavior_set(memc_repl, MEMCACHED_DISTRIBUTION_CONSISTENT, 1);
26+ memcached_behavior_set(memc_single, MEMCACHED_DISTRIBUTION_CONSISTENT, 1);
27+
28+ /* The first clone writes to all servers */
29+ memcached_behavior_set(memc_repl, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
30+ memcached_behavior_set(memc_repl, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS,
31+ memcached_server_count(memc_repl));
32+
33+ /* Write to servers */
34+ rc= memcached_set(memc_repl, key, strlen(key),
35+ value, strlen(value),
36+ (time_t)1200, (uint32_t)0);
37+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
38+
39+ /* Use the second clone to remove the key from primary server.
40+ This should remove the key from only one server */
41+ rc= memcached_delete(memc_single, key, strlen(key), 0);
42+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
43+
44+ /* Remove the server where the key was deleted */
45+ memcached_server_st *instance= memcached_server_by_key(memc_single, key, strlen(key), &rc);
46+ test_true(rc == MEMCACHED_SUCCESS);
47+ rc= memcached_server_remove(instance);
48+ test_true(rc == MEMCACHED_SUCCESS);
49+
50+ /* Test that others still have it */
51+ v= memcached_get(memc_single, key, strlen(key), &vlen, &flags, &rc);
52+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
53+ test_true(v && strcmp(v, value) == 0);
54+ free(v);
55+
56+ /* This read should still return the value as we have it on other servers */
57+ v= memcached_get(memc_repl, key, strlen(key), &vlen, &flags, &rc);
58+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
59+ test_true(v && strcmp(v, value) == 0);
60+ free(v);
61+
62+ memcached_free(memc_repl);
63+ memcached_free(memc_single);
64+
65+ return TEST_SUCCESS;
66+}
67+
68 static test_return_t replication_delete_test(memcached_st *memc)
69 {
70 memcached_return_t rc;
71@@ -5995,6 +6055,7 @@
72 {"set", 1, (test_callback_fn)replication_set_test },
73 {"get", 0, (test_callback_fn)replication_get_test },
74 {"mget", 0, (test_callback_fn)replication_mget_test },
75+ {"miss", 0, (test_callback_fn)replication_miss_test},
76 {"delete", 0, (test_callback_fn)replication_delete_test },
77 {"rand_mget", 0, (test_callback_fn)replication_randomize_mget_test },
78 {0, 0, (test_callback_fn)0}

Subscribers

People subscribed via source and target branches

to all changes: