Merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/feature-server_timeout into lp:libmemcached/1.0

Proposed by Massive Media
Status: Needs review
Proposed branch: lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/feature-server_timeout
Merge into: lp:libmemcached/1.0
Diff against target: 227 lines (+50/-18)
13 files modified
libmemcached-1.0/defaults.h (+1/-1)
libmemcached-1.0/struct/memcached.h (+1/-0)
libmemcached-1.0/struct/server.h (+2/-0)
libmemcached-1.0/types/behavior.h (+1/-0)
libmemcached/behavior.cc (+7/-0)
libmemcached/connect.cc (+1/-0)
libmemcached/instance.cc (+2/-0)
libmemcached/instance.hpp (+3/-0)
libmemcached/memcached.cc (+2/-0)
libmemcached/quit.cc (+1/-0)
libmemcached/server.cc (+2/-0)
libmemcached/server.hpp (+26/-17)
tests/libmemcached-1.0/mem_functions.cc (+1/-0)
To merge this branch: bzr merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/feature-server_timeout
Reviewer Review Type Date Requested Status
Brian Aker Approve
Maurus Cuelenaere (community) Approve
Tangent Trunk Pending
Review via email: mp+195974@code.launchpad.net

Description of the change

Added server_timeout_counter and behavior MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT.

This feature works as follows:
When a timeout occurs, retry MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT times before
putting the server in MEMCACHED_SERVER_STATE_IN_TIMEOUT state.

It makes sense to not fail from the 1st time but retry on the next calls before marking
the server as timeout. Since the default is 0 (don't retry first before marking as TIMEOUT) it will be backwards compatible.

To post a comment you must log in.
Revision history for this message
Maurus Cuelenaere (mcuelenaere) wrote :

LGTM

review: Approve
Revision history for this message
Brian Aker (brianaker) wrote :

This has been merged.

review: Approve

Unmerged revisions

1173. By nicolas

Added server_timeout_counter and behavior MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT.

This feature works as follows:
When a timeout occurs, retry MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT times before
putting the server in MEMCACHED_SERVER_STATE_IN_TIMEOUT state.

It makes sense to not fail from the 1st time but retry on the next calls before marking
the server as timeout.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libmemcached-1.0/defaults.h'
2--- libmemcached-1.0/defaults.h 2013-05-03 08:44:02 +0000
3+++ libmemcached-1.0/defaults.h 2013-11-20 15:54:23 +0000
4@@ -52,5 +52,5 @@
5 #define MEMCACHED_SERVER_FAILURE_LIMIT 5
6 #define MEMCACHED_SERVER_FAILURE_RETRY_TIMEOUT 2
7 #define MEMCACHED_SERVER_FAILURE_DEAD_TIMEOUT 0
8-
9+#define MEMCACHED_SERVER_TIMEOUT_LIMIT 0
10
11
12=== modified file 'libmemcached-1.0/struct/memcached.h'
13--- libmemcached-1.0/struct/memcached.h 2013-03-31 23:24:29 +0000
14+++ libmemcached-1.0/struct/memcached.h 2013-11-20 15:54:23 +0000
15@@ -79,6 +79,7 @@
16 int32_t snd_timeout;
17 int32_t rcv_timeout;
18 uint32_t server_failure_limit;
19+ uint32_t server_timeout_limit;
20 uint32_t io_msg_watermark;
21 uint32_t io_bytes_watermark;
22 uint32_t io_key_prefetch;
23
24=== modified file 'libmemcached-1.0/struct/server.h'
25--- libmemcached-1.0/struct/server.h 2012-10-25 06:28:22 +0000
26+++ libmemcached-1.0/struct/server.h 2013-11-20 15:54:23 +0000
27@@ -77,6 +77,8 @@
28 uint32_t request_id;
29 uint32_t server_failure_counter;
30 uint64_t server_failure_counter_query_id;
31+ uint32_t server_timeout_counter;
32+ uint64_t server_timeout_counter_query_id;
33 uint32_t weight;
34 uint32_t version;
35 enum memcached_server_state_t state;
36
37=== modified file 'libmemcached-1.0/types/behavior.h'
38--- libmemcached-1.0/types/behavior.h 2012-01-08 00:54:08 +0000
39+++ libmemcached-1.0/types/behavior.h 2013-11-20 15:54:23 +0000
40@@ -76,6 +76,7 @@
41 MEMCACHED_BEHAVIOR_LOAD_FROM_FILE,
42 MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS,
43 MEMCACHED_BEHAVIOR_DEAD_TIMEOUT,
44+ MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT,
45 MEMCACHED_BEHAVIOR_MAX
46 };
47
48
49=== modified file 'libmemcached/behavior.cc'
50--- libmemcached/behavior.cc 2013-03-31 23:24:29 +0000
51+++ libmemcached/behavior.cc 2013-11-20 15:54:23 +0000
52@@ -116,6 +116,10 @@
53 ptr->server_failure_limit= uint32_t(data);
54 break;
55
56+ case MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT:
57+ ptr->server_timeout_limit= uint32_t(data);
58+ break;
59+
60 case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
61 send_quit(ptr); // We need t shutdown all of the connections to make sure we do the correct protocol
62 if (data)
63@@ -379,6 +383,9 @@
64 case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT:
65 return ptr->server_failure_limit;
66
67+ case MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT:
68+ return ptr->server_timeout_limit;
69+
70 case MEMCACHED_BEHAVIOR_SORT_HOSTS:
71 return ptr->flags.use_sort_hosts;
72
73
74=== modified file 'libmemcached/connect.cc'
75--- libmemcached/connect.cc 2013-09-17 03:23:55 +0000
76+++ libmemcached/connect.cc 2013-11-20 15:54:23 +0000
77@@ -713,6 +713,7 @@
78 if (_gettime_success and server->next_retry < curr_time.tv_sec)
79 {
80 server->state= MEMCACHED_SERVER_STATE_NEW;
81+ server->server_timeout_counter= 0;
82 }
83 else
84 {
85
86=== modified file 'libmemcached/instance.cc'
87--- libmemcached/instance.cc 2013-03-31 23:24:29 +0000
88+++ libmemcached/instance.cc 2013-11-20 15:54:23 +0000
89@@ -54,6 +54,8 @@
90 self->request_id= 0;
91 self->server_failure_counter= 0;
92 self->server_failure_counter_query_id= 0;
93+ self->server_timeout_counter= 0;
94+ self->server_timeout_counter_query_id= 0;
95 self->weight= weight ? weight : 1; // 1 is the default weight value
96 self->io_wait_count.read= 0;
97 self->io_wait_count.write= 0;
98
99=== modified file 'libmemcached/instance.hpp'
100--- libmemcached/instance.hpp 2013-03-31 23:24:29 +0000
101+++ libmemcached/instance.hpp 2013-11-20 15:54:23 +0000
102@@ -73,6 +73,7 @@
103 void mark_server_as_clean()
104 {
105 server_failure_counter= 0;
106+ server_timeout_counter= 0;
107 next_retry= 0;
108 }
109
110@@ -147,6 +148,8 @@
111 uint32_t request_id;
112 uint32_t server_failure_counter;
113 uint64_t server_failure_counter_query_id;
114+ uint32_t server_timeout_counter;
115+ uint32_t server_timeout_counter_query_id;
116 uint32_t weight;
117 uint32_t version;
118 enum memcached_server_state_t state;
119
120=== modified file 'libmemcached/memcached.cc'
121--- libmemcached/memcached.cc 2013-03-31 23:24:29 +0000
122+++ libmemcached/memcached.cc 2013-11-20 15:54:23 +0000
123@@ -87,6 +87,7 @@
124 self->snd_timeout= 0;
125 self->rcv_timeout= 0;
126 self->server_failure_limit= MEMCACHED_SERVER_FAILURE_LIMIT;
127+ self->server_timeout_limit= MEMCACHED_SERVER_TIMEOUT_LIMIT;
128 self->query_id= 1; // 0 is considered invalid
129
130 /* TODO, Document why we picked these defaults */
131@@ -362,6 +363,7 @@
132 new_clone->get_key_failure= source->get_key_failure;
133 new_clone->delete_trigger= source->delete_trigger;
134 new_clone->server_failure_limit= source->server_failure_limit;
135+ new_clone->server_timeout_limit= source->server_timeout_limit;
136 new_clone->io_msg_watermark= source->io_msg_watermark;
137 new_clone->io_bytes_watermark= source->io_bytes_watermark;
138 new_clone->io_key_prefetch= source->io_key_prefetch;
139
140=== modified file 'libmemcached/quit.cc'
141--- libmemcached/quit.cc 2013-03-31 23:24:29 +0000
142+++ libmemcached/quit.cc 2013-11-20 15:54:23 +0000
143@@ -93,6 +93,7 @@
144 * sent to the server.
145 */
146 instance->server_failure_counter= 0;
147+ instance->server_timeout_counter= 0;
148 }
149 }
150
151
152=== modified file 'libmemcached/server.cc'
153--- libmemcached/server.cc 2013-03-31 23:24:29 +0000
154+++ libmemcached/server.cc 2013-11-20 15:54:23 +0000
155@@ -54,6 +54,8 @@
156 self->request_id= 0;
157 self->server_failure_counter= 0;
158 self->server_failure_counter_query_id= 0;
159+ self->server_timeout_counter= 0;
160+ self->server_timeout_counter_query_id= 0;
161 self->weight= weight ? weight : 1; // 1 is the default weight value
162 self->io_wait_count.read= 0;
163 self->io_wait_count.write= 0;
164
165=== modified file 'libmemcached/server.hpp'
166--- libmemcached/server.hpp 2013-03-31 23:24:29 +0000
167+++ libmemcached/server.hpp 2013-11-20 15:54:23 +0000
168@@ -76,22 +76,31 @@
169 {
170 if (server->state != MEMCACHED_SERVER_STATE_IN_TIMEOUT)
171 {
172- struct timeval next_time;
173- if (gettimeofday(&next_time, NULL) == 0)
174- {
175- server->next_retry= next_time.tv_sec +server->root->retry_timeout;
176- }
177- else
178- {
179- server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly
180- }
181-
182- server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT;
183- if (server->server_failure_counter_query_id != server->root->query_id)
184- {
185- server->server_failure_counter++;
186- server->server_failure_counter_query_id= server->root->query_id;
187- }
188- set_last_disconnected_host(server);
189+ if (server->server_timeout_counter_query_id != server->root->query_id)
190+ {
191+ server->server_timeout_counter++;
192+ server->server_timeout_counter_query_id= server->root->query_id;
193+ }
194+
195+ if (server->server_timeout_counter >= server->root->server_timeout_limit)
196+ {
197+ struct timeval next_time;
198+ if (gettimeofday(&next_time, NULL) == 0)
199+ {
200+ server->next_retry= next_time.tv_sec +server->root->retry_timeout;
201+ }
202+ else
203+ {
204+ server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly
205+ }
206+
207+ server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT;
208+ if (server->server_failure_counter_query_id != server->root->query_id)
209+ {
210+ server->server_failure_counter++;
211+ server->server_failure_counter_query_id= server->root->query_id;
212+ }
213+ set_last_disconnected_host(server);
214+ }
215 }
216 }
217
218=== modified file 'tests/libmemcached-1.0/mem_functions.cc'
219--- tests/libmemcached-1.0/mem_functions.cc 2013-11-04 11:17:45 +0000
220+++ tests/libmemcached-1.0/mem_functions.cc 2013-11-20 15:54:23 +0000
221@@ -412,6 +412,7 @@
222 test_true(memc_clone->retry_timeout == memc->retry_timeout);
223 test_true(memc_clone->send_size == memc->send_size);
224 test_true(memc_clone->server_failure_limit == memc->server_failure_limit);
225+ test_true(memc_clone->server_timeout_limit == memc->server_timeout_limit);
226 test_true(memc_clone->snd_timeout == memc->snd_timeout);
227 test_true(memc_clone->user_data == memc->user_data);
228

Subscribers

People subscribed via source and target branches

to all changes: