em-voldemort 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,307 @@
1
+ require 'spec_helper'
2
+
3
+ describe EM::Voldemort::Connection do
4
+ before do
5
+ EM::Voldemort::Connection.any_instance.stub(:setup_status_check_timer) do |&timer|
6
+ @status_check_timer = timer
7
+ double('timer', :cancel => nil)
8
+ end
9
+
10
+ @logger = Logger.new($stdout)
11
+ @logger.level = Logger::ERROR
12
+ @connection = EM::Voldemort::Connection.new :host => 'localhost', :port => 6666, :logger => @logger
13
+
14
+ Timecop.freeze
15
+ end
16
+
17
+ def expect_connect(&block)
18
+ EM.should_receive(:connect).once do |host, port, handler_module, *args|
19
+ Class.new(Object) { include handler_module }.new(*args).tap do |handler|
20
+ yield handler
21
+ handler.post_init
22
+ end
23
+ end
24
+ end
25
+
26
+ def setup_connection(&block)
27
+ expect_connect do |handler|
28
+ handler.should_receive(:send_data).with('pb0') do |request|
29
+ EM.next_tick do
30
+ handler.receive_data('ok')
31
+ yield handler if block_given?
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def later(elapsed_seconds)
38
+ Timecop.freeze(elapsed_seconds)
39
+ @elapsed_time ||= 0
40
+ if ((@elapsed_time + elapsed_seconds) / EM::Voldemort::Connection::STATUS_CHECK_PERIOD).floor >
41
+ (@elapsed_time / EM::Voldemort::Connection::STATUS_CHECK_PERIOD).floor
42
+ @status_check_timer.call
43
+ end
44
+ @elapsed_time += elapsed_seconds
45
+ end
46
+
47
+
48
+ it 'should negotiate the protocol at the start of the connection' do
49
+ setup_connection do |handler|
50
+ handler.state.should == :idle
51
+ @connection.health.should == :good
52
+ EM.stop
53
+ end
54
+ EM.run { @connection.connect }
55
+ end
56
+
57
+ it 'should disconnect if the server does not support the protocol' do
58
+ expect_connect do |handler|
59
+ handler.should_receive(:send_data) do |request|
60
+ request.should == 'pb0'
61
+ EM.next_tick do
62
+ handler.should_receive(:close_connection) { handler.unbind }
63
+ handler.receive_data('no')
64
+ handler.state.should == :disconnected
65
+ @connection.health.should == :bad
66
+ EM.stop
67
+ end
68
+ end
69
+ end
70
+ EM.run { @connection.connect }
71
+ end
72
+
73
+ it 'should try reconnecting after a delay if the host is unresolvable' do
74
+ EM.run do
75
+ EM.should_receive(:connect).once.and_raise(EventMachine::ConnectionError, 'unable to resolve server address')
76
+ @connection.connect # first connection attempt
77
+ @connection.health.should == :bad
78
+ later(2) # no reconnect only 2 seconds after first attempt
79
+ setup_connection do |handler| # second attempt is successful
80
+ handler.state.should == :idle
81
+ @connection.health.should == :good
82
+ EM.stop
83
+ end
84
+ later(4) # 6 seconds after first attempt, status check timer has fired
85
+ end
86
+ end
87
+
88
+ it 'should immediately fail requests if the host is unresolvable' do
89
+ EM.run do
90
+ EM.should_receive(:connect).once.and_raise(EventMachine::ConnectionError, 'unable to resolve server address')
91
+ failed1, failed2 = false, false
92
+ @connection.send_request('foo').errback { failed1 = true }
93
+ @connection.send_request('bar').errback { failed2 = true }
94
+ failed1.should be_true
95
+ failed2.should be_true
96
+ EM.stop
97
+ end
98
+ end
99
+
100
+ it 'should disconnect and reconnect if protocol negotiation times out' do
101
+ expect_connect do |handler|
102
+ handler.should_receive(:send_data).with('pb0')
103
+ EM.next_tick do
104
+ later(2) # no timeout after only 2 seconds
105
+ handler.should_receive(:close_connection) { handler.unbind }
106
+ EM.should_receive(:connect) do
107
+ @connection.health.should == :bad
108
+ EM.stop
109
+ double('connection', :in_flight => EM::DefaultDeferrable.new)
110
+ end
111
+ later(4) # 6 seconds after sending protocol request, give up
112
+ end
113
+ end
114
+ EM.run { @connection.connect }
115
+ end
116
+
117
+ it 'should try reconnecting after a delay if the connection is closed' do
118
+ setup_connection do |handler|
119
+ later(16) # sit idle for a while
120
+ handler.unbind 'connection reset by peer'
121
+ @connection.health.should == :bad
122
+ later(2) # no reconnect only 2 seconds after disconnection
123
+ setup_connection do
124
+ @connection.health.should == :good
125
+ EM.stop
126
+ end
127
+ later(4) # 6 seconds after disconnection, status check timer has fired
128
+ end
129
+ EM.run { @connection.connect }
130
+ end
131
+
132
+ it 'should immediately fail requests while the connection is closed' do
133
+ setup_connection do |handler|
134
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once do
135
+ EM.next_tick { handler.receive_data([9, 'response1'].pack('NA*')) }
136
+ end
137
+ @connection.send_request('request1').callback do
138
+ handler.unbind
139
+ failed1, failed2 = false, false
140
+ @connection.send_request('request2').errback { failed1 = true }
141
+ @connection.send_request('request3').errback { failed2 = true }
142
+ failed1.should be_true
143
+ failed2.should be_true
144
+ EM.stop
145
+ end
146
+ end
147
+ EM.run { @connection.connect }
148
+ end
149
+
150
+ it 'should reassemble responses split across multiple packets' do
151
+ setup_connection do |handler|
152
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once do
153
+ EM.next_tick do
154
+ handler.receive_data([9, 'respon'].pack('NA*'))
155
+ EM.next_tick { handler.receive_data('se1') }
156
+ end
157
+ end
158
+ @connection.send_request('request1').callback do |response|
159
+ response.should == 'response1'
160
+ EM.stop
161
+ end
162
+ end
163
+ EM.run { @connection.connect }
164
+ end
165
+
166
+ describe 'queueing requests' do
167
+ def three_queued_requests(handler)
168
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once do
169
+ EM.next_tick do
170
+ handler.should_receive(:send_data).with([8, 'request2'].pack('NA*')).once do
171
+ EM.next_tick do
172
+ handler.should_receive(:send_data).with([8, 'request3'].pack('NA*')).once do
173
+ EM.next_tick do
174
+ handler.receive_data([9, 'response3'].pack('NA*'))
175
+ end
176
+ end
177
+ handler.receive_data([9, 'response2'].pack('NA*'))
178
+ end
179
+ end
180
+ handler.receive_data([9, 'response1'].pack('NA*'))
181
+ end
182
+ end
183
+ end
184
+
185
+ it 'should queue up requests made before the previous request returns' do
186
+ setup_connection do |handler|
187
+ three_queued_requests(handler)
188
+ @connection.send_request('request1').callback {|response| @response1 = response }
189
+ @connection.send_request('request2').callback {|response| @response2 = response }
190
+ @connection.send_request('request3').callback do |response|
191
+ @response1.should == 'response1'
192
+ @response2.should == 'response2'
193
+ response.should == 'response3'
194
+ EM.stop
195
+ end
196
+ end
197
+ EM.run { @connection.connect }
198
+ end
199
+
200
+ it 'should queue up requests made in the callback of a previous response' do
201
+ setup_connection do |handler|
202
+ three_queued_requests(handler)
203
+ @connection.send_request('request1').callback do |response1|
204
+ response1.should == 'response1'
205
+ @connection.send_request('request2').callback do |response2|
206
+ response2.should == 'response2'
207
+ end
208
+ @connection.send_request('request3').callback do |response2|
209
+ response2.should == 'response3'
210
+ EM.stop
211
+ end
212
+ end
213
+ end
214
+ EM.run { @connection.connect }
215
+ end
216
+
217
+ it 'should queue up requests made while protocol negotiation is in progress' do
218
+ expect_connect do |handler|
219
+ handler.should_receive(:send_data).with('pb0')
220
+ EM.next_tick do
221
+ @connection.health.should == :good
222
+ @connection.send_request('request1')
223
+ later(2)
224
+ EM.next_tick do
225
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')) { EM.stop }
226
+ handler.receive_data('ok')
227
+ end
228
+ end
229
+ end
230
+ EM.run { @connection.connect }
231
+ end
232
+ end
233
+
234
+ it 'should close the connection and reconnect if a request takes too long' do
235
+ setup_connection do |handler|
236
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once
237
+ @connection.send_request('request1').errback { EM.stop }
238
+ later(2) # not timed out yet after 2 seconds
239
+ @connection.health.should == :good
240
+ handler.should_receive(:close_connection) { handler.unbind }
241
+ EM.should_receive(:connect).and_return(double('handler', :in_flight => EM::DefaultDeferrable.new))
242
+ later(4) # after 6 seconds, should time out and call the errback
243
+ @connection.health.should == :bad
244
+ end
245
+ EM.run { @connection.connect }
246
+ end
247
+
248
+ it 'should close the connection when asked to shut down' do
249
+ setup_connection do |handler|
250
+ later(16) # sit idle for a while
251
+ handler.should_receive(:close_connection) { EM.next_tick { handler.unbind } }
252
+ deferrable = @connection.close
253
+ @connection.health.should == :bad
254
+ deferrable.callback { EM.stop }
255
+ end
256
+ EM.run { @connection.connect }
257
+ end
258
+
259
+ it 'should handle outstanding requests when asked to shut down' do
260
+ setup_connection do |handler|
261
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once do
262
+ EM.next_tick do
263
+ @connection.close.callback do
264
+ @response1.should == 'response1'
265
+ @error2.should be_true
266
+ @error3.should be_true
267
+ EM.stop
268
+ end
269
+ EM.next_tick do
270
+ handler.should_receive(:close_connection) { EM.next_tick { handler.unbind } }
271
+ handler.receive_data([9, 'response1'].pack('NA*'))
272
+ end
273
+ end
274
+ end
275
+ @connection.send_request('request1').callback {|response| @response1 = response }
276
+ @connection.send_request('request2').errback { @error2 = true }
277
+ @connection.send_request('request3').errback { @error3 = true }
278
+ end
279
+ EM.run { @connection.connect }
280
+ end
281
+
282
+ it 'should fail outstanding requests when the connection is closed' do
283
+ setup_connection do |handler|
284
+ handler.should_receive(:send_data).with([8, 'request1'].pack('NA*')).once do
285
+ EM.next_tick do
286
+ handler.unbind
287
+ @error1.should be_true
288
+ @error2.should be_true
289
+ EM.stop
290
+ end
291
+ end
292
+ @connection.send_request('request1').errback { @error1 = true }
293
+ @connection.send_request('request2').errback { @error2 = true }
294
+ end
295
+ EM.run { @connection.connect }
296
+ end
297
+
298
+ it 'should handle a shutdown request while in error state' do
299
+ EM.run do
300
+ EM.should_receive(:connect).once.and_raise(EventMachine::ConnectionError, 'unable to resolve server address')
301
+ @connection.send_request('foo')
302
+ EM.next_tick do
303
+ @connection.close.callback { EM.stop }
304
+ end
305
+ end
306
+ end
307
+ end
@@ -0,0 +1,323 @@
1
+ <cluster>
2
+ <name>example-voldemort-cluster</name>
3
+ <server>
4
+ <id>0</id>
5
+ <host>voldemort00.example.com</host>
6
+ <http-port>8081</http-port>
7
+ <socket-port>6666</socket-port>
8
+ <admin-port>6667</admin-port>
9
+ <partitions>14, 45, 240, 266, 271, 274, 288, 318, 342, 389, 393, 464, 492</partitions>
10
+ </server>
11
+ <server>
12
+ <id>1</id>
13
+ <host>voldemort01.example.com</host>
14
+ <http-port>8081</http-port>
15
+ <socket-port>6666</socket-port>
16
+ <admin-port>6667</admin-port>
17
+ <partitions>38, 40, 46, 88, 93, 96, 103, 152, 325, 344, 354, 445, 531</partitions>
18
+ </server>
19
+ <server>
20
+ <id>2</id>
21
+ <host>voldemort02.example.com</host>
22
+ <http-port>8081</http-port>
23
+ <socket-port>6666</socket-port>
24
+ <admin-port>6667</admin-port>
25
+ <partitions>5, 10, 98, 135, 176, 276, 305, 341, 449, 452, 473, 500, 509</partitions>
26
+ </server>
27
+ <server>
28
+ <id>3</id>
29
+ <host>voldemort03.example.com</host>
30
+ <http-port>8081</http-port>
31
+ <socket-port>6666</socket-port>
32
+ <admin-port>6667</admin-port>
33
+ <partitions>18, 43, 92, 137, 144, 224, 239, 300, 334, 381, 401, 403, 412, 457</partitions>
34
+ </server>
35
+ <server>
36
+ <id>4</id>
37
+ <host>voldemort04.example.com</host>
38
+ <http-port>8081</http-port>
39
+ <socket-port>6666</socket-port>
40
+ <admin-port>6667</admin-port>
41
+ <partitions>132, 219, 222, 299, 324, 374, 397, 409, 413, 421, 424, 442, 472, 501</partitions>
42
+ </server>
43
+ <server>
44
+ <id>5</id>
45
+ <host>voldemort05.example.com</host>
46
+ <http-port>8081</http-port>
47
+ <socket-port>6666</socket-port>
48
+ <admin-port>6667</admin-port>
49
+ <partitions>47, 64, 158, 167, 226, 283, 315, 348, 350, 361, 366, 384, 430, 529</partitions>
50
+ </server>
51
+ <server>
52
+ <id>6</id>
53
+ <host>voldemort06.example.com</host>
54
+ <http-port>8081</http-port>
55
+ <socket-port>6666</socket-port>
56
+ <admin-port>6667</admin-port>
57
+ <partitions>26, 117, 136, 194, 212, 225, 360, 407, 454, 475, 477, 479, 491, 530</partitions>
58
+ </server>
59
+ <server>
60
+ <id>7</id>
61
+ <host>voldemort07.example.com</host>
62
+ <http-port>8081</http-port>
63
+ <socket-port>6666</socket-port>
64
+ <admin-port>6667</admin-port>
65
+ <partitions>73, 79, 95, 123, 129, 133, 142, 155, 187, 197, 205, 206, 471, 485</partitions>
66
+ </server>
67
+ <server>
68
+ <id>8</id>
69
+ <host>voldemort08.example.com</host>
70
+ <http-port>8081</http-port>
71
+ <socket-port>6666</socket-port>
72
+ <admin-port>6667</admin-port>
73
+ <partitions>33, 66, 68, 80, 81, 86, 89, 102, 111, 193, 232, 298, 369, 488</partitions>
74
+ </server>
75
+ <server>
76
+ <id>9</id>
77
+ <host>voldemort09.example.com</host>
78
+ <http-port>8081</http-port>
79
+ <socket-port>6666</socket-port>
80
+ <admin-port>6667</admin-port>
81
+ <partitions>159, 166, 209, 249, 273, 286, 308, 337, 353, 376, 410, 426, 495, 496</partitions>
82
+ </server>
83
+ <server>
84
+ <id>10</id>
85
+ <host>voldemort10.example.com</host>
86
+ <http-port>8081</http-port>
87
+ <socket-port>6666</socket-port>
88
+ <admin-port>6667</admin-port>
89
+ <partitions>31, 125, 154, 174, 191, 221, 303, 309, 329, 394, 448, 498, 505, 522</partitions>
90
+ </server>
91
+ <server>
92
+ <id>11</id>
93
+ <host>voldemort11.example.com</host>
94
+ <http-port>8081</http-port>
95
+ <socket-port>6666</socket-port>
96
+ <admin-port>6667</admin-port>
97
+ <partitions>23, 30, 59, 130, 289, 357, 358, 367, 446, 456, 466, 493, 533, 535</partitions>
98
+ </server>
99
+ <server>
100
+ <id>12</id>
101
+ <host>voldemort12.example.com</host>
102
+ <http-port>8081</http-port>
103
+ <socket-port>6666</socket-port>
104
+ <admin-port>6667</admin-port>
105
+ <partitions>2, 50, 53, 138, 153, 215, 257, 262, 295, 349, 371, 386, 428, 502</partitions>
106
+ </server>
107
+ <server>
108
+ <id>13</id>
109
+ <host>voldemort13.example.com</host>
110
+ <http-port>8081</http-port>
111
+ <socket-port>6666</socket-port>
112
+ <admin-port>6667</admin-port>
113
+ <partitions>71, 107, 146, 265, 277, 306, 326, 400, 463, 483, 494, 515, 518, 536</partitions>
114
+ </server>
115
+ <server>
116
+ <id>14</id>
117
+ <host>voldemort14.example.com</host>
118
+ <http-port>8081</http-port>
119
+ <socket-port>6666</socket-port>
120
+ <admin-port>6667</admin-port>
121
+ <partitions>20, 24, 97, 179, 241, 287, 362, 364, 431, 470, 476, 484, 489, 538</partitions>
122
+ </server>
123
+ <server>
124
+ <id>15</id>
125
+ <host>voldemort15.example.com</host>
126
+ <http-port>8081</http-port>
127
+ <socket-port>6666</socket-port>
128
+ <admin-port>6667</admin-port>
129
+ <partitions>94, 109, 116, 208, 227, 255, 280, 291, 351, 420, 439, 450, 510, 539</partitions>
130
+ </server>
131
+ <server>
132
+ <id>16</id>
133
+ <host>voldemort16.example.com</host>
134
+ <http-port>8081</http-port>
135
+ <socket-port>6666</socket-port>
136
+ <admin-port>6667</admin-port>
137
+ <partitions>1, 4, 76, 242, 246, 250, 258, 297, 373, 392, 429, 467, 482, 521</partitions>
138
+ </server>
139
+ <server>
140
+ <id>17</id>
141
+ <host>voldemort17.example.com</host>
142
+ <http-port>8081</http-port>
143
+ <socket-port>6666</socket-port>
144
+ <admin-port>6667</admin-port>
145
+ <partitions>29, 32, 57, 106, 149, 164, 199, 216, 263, 379, 411, 481, 519, 537</partitions>
146
+ </server>
147
+ <server>
148
+ <id>18</id>
149
+ <host>voldemort18.example.com</host>
150
+ <http-port>8081</http-port>
151
+ <socket-port>6666</socket-port>
152
+ <admin-port>6667</admin-port>
153
+ <partitions>19, 22, 56, 100, 128, 156, 217, 245, 292, 370, 396, 415, 427, 527</partitions>
154
+ </server>
155
+ <server>
156
+ <id>19</id>
157
+ <host>voldemort19.example.com</host>
158
+ <http-port>8081</http-port>
159
+ <socket-port>6666</socket-port>
160
+ <admin-port>6667</admin-port>
161
+ <partitions>21, 41, 62, 134, 186, 314, 333, 347, 372, 433, 443, 458, 513, 520</partitions>
162
+ </server>
163
+ <server>
164
+ <id>20</id>
165
+ <host>voldemort20.example.com</host>
166
+ <http-port>8081</http-port>
167
+ <socket-port>6666</socket-port>
168
+ <admin-port>6667</admin-port>
169
+ <partitions>82, 143, 171, 177, 188, 231, 247, 251, 296, 368, 380, 416, 419, 506</partitions>
170
+ </server>
171
+ <server>
172
+ <id>21</id>
173
+ <host>voldemort21.example.com</host>
174
+ <http-port>8081</http-port>
175
+ <socket-port>6666</socket-port>
176
+ <admin-port>6667</admin-port>
177
+ <partitions>16, 99, 112, 118, 120, 157, 168, 192, 204, 244, 440, 490, 499, 512</partitions>
178
+ </server>
179
+ <server>
180
+ <id>22</id>
181
+ <host>voldemort22.example.com</host>
182
+ <http-port>8081</http-port>
183
+ <socket-port>6666</socket-port>
184
+ <admin-port>6667</admin-port>
185
+ <partitions>17, 101, 127, 182, 189, 198, 234, 278, 313, 319, 432, 434, 441, 534</partitions>
186
+ </server>
187
+ <server>
188
+ <id>23</id>
189
+ <host>voldemort23.example.com</host>
190
+ <http-port>8081</http-port>
191
+ <socket-port>6666</socket-port>
192
+ <admin-port>6667</admin-port>
193
+ <partitions>52, 55, 63, 65, 69, 104, 126, 161, 321, 352, 461, 465, 526</partitions>
194
+ </server>
195
+ <server>
196
+ <id>24</id>
197
+ <host>voldemort24.example.com</host>
198
+ <http-port>8081</http-port>
199
+ <socket-port>6666</socket-port>
200
+ <admin-port>6667</admin-port>
201
+ <partitions>48, 121, 148, 207, 210, 229, 248, 302, 408, 414, 478, 497, 523</partitions>
202
+ </server>
203
+ <server>
204
+ <id>25</id>
205
+ <host>voldemort25.example.com</host>
206
+ <http-port>8081</http-port>
207
+ <socket-port>6666</socket-port>
208
+ <admin-port>6667</admin-port>
209
+ <partitions>12, 77, 108, 122, 150, 190, 202, 214, 293, 304, 330, 343, 525</partitions>
210
+ </server>
211
+ <server>
212
+ <id>26</id>
213
+ <host>voldemort26.example.com</host>
214
+ <http-port>8081</http-port>
215
+ <socket-port>6666</socket-port>
216
+ <admin-port>6667</admin-port>
217
+ <partitions>61, 165, 172, 180, 195, 233, 252, 259, 267, 282, 346, 404, 438</partitions>
218
+ </server>
219
+ <server>
220
+ <id>27</id>
221
+ <host>voldemort27.example.com</host>
222
+ <http-port>8081</http-port>
223
+ <socket-port>6666</socket-port>
224
+ <admin-port>6667</admin-port>
225
+ <partitions>75, 90, 114, 139, 162, 163, 223, 310, 336, 355, 398, 437, 511</partitions>
226
+ </server>
227
+ <server>
228
+ <id>28</id>
229
+ <host>voldemort28.example.com</host>
230
+ <http-port>8081</http-port>
231
+ <socket-port>6666</socket-port>
232
+ <admin-port>6667</admin-port>
233
+ <partitions>6, 7, 36, 39, 105, 254, 365, 423, 451, 468, 486, 507, 524</partitions>
234
+ </server>
235
+ <server>
236
+ <id>29</id>
237
+ <host>voldemort29.example.com</host>
238
+ <http-port>8081</http-port>
239
+ <socket-port>6666</socket-port>
240
+ <admin-port>6667</admin-port>
241
+ <partitions>3, 49, 72, 84, 85, 181, 213, 236, 281, 311, 382, 388, 405</partitions>
242
+ </server>
243
+ <server>
244
+ <id>30</id>
245
+ <host>voldemort30.example.com</host>
246
+ <http-port>8081</http-port>
247
+ <socket-port>6666</socket-port>
248
+ <admin-port>6667</admin-port>
249
+ <partitions>27, 37, 78, 185, 196, 201, 238, 269, 294, 316, 335, 377, 418</partitions>
250
+ </server>
251
+ <server>
252
+ <id>31</id>
253
+ <host>voldemort31.example.com</host>
254
+ <http-port>8081</http-port>
255
+ <socket-port>6666</socket-port>
256
+ <admin-port>6667</admin-port>
257
+ <partitions>0, 11, 113, 119, 151, 183, 284, 345, 383, 399, 474, 487, 514</partitions>
258
+ </server>
259
+ <server>
260
+ <id>32</id>
261
+ <host>voldemort32.example.com</host>
262
+ <http-port>8081</http-port>
263
+ <socket-port>6666</socket-port>
264
+ <admin-port>6667</admin-port>
265
+ <partitions>9, 54, 140, 211, 230, 301, 323, 327, 331, 359, 385, 453, 503</partitions>
266
+ </server>
267
+ <server>
268
+ <id>33</id>
269
+ <host>voldemort33.example.com</host>
270
+ <http-port>8081</http-port>
271
+ <socket-port>6666</socket-port>
272
+ <admin-port>6667</admin-port>
273
+ <partitions>124, 175, 184, 235, 237, 264, 307, 322, 332, 339, 340, 435, 469</partitions>
274
+ </server>
275
+ <server>
276
+ <id>34</id>
277
+ <host>voldemort34.example.com</host>
278
+ <http-port>8081</http-port>
279
+ <socket-port>6666</socket-port>
280
+ <admin-port>6667</admin-port>
281
+ <partitions>91, 170, 173, 178, 268, 285, 328, 338, 378, 387, 390, 444, 480</partitions>
282
+ </server>
283
+ <server>
284
+ <id>35</id>
285
+ <host>voldemort35.example.com</host>
286
+ <http-port>8081</http-port>
287
+ <socket-port>6666</socket-port>
288
+ <admin-port>6667</admin-port>
289
+ <partitions>13, 15, 44, 141, 220, 228, 275, 320, 356, 436, 460, 462, 517</partitions>
290
+ </server>
291
+ <server>
292
+ <id>36</id>
293
+ <host>voldemort36.example.com</host>
294
+ <http-port>8081</http-port>
295
+ <socket-port>6666</socket-port>
296
+ <admin-port>6667</admin-port>
297
+ <partitions>25, 35, 70, 74, 253, 261, 270, 425, 447, 459, 504, 508, 516</partitions>
298
+ </server>
299
+ <server>
300
+ <id>37</id>
301
+ <host>voldemort37.example.com</host>
302
+ <http-port>8081</http-port>
303
+ <socket-port>6666</socket-port>
304
+ <admin-port>6667</admin-port>
305
+ <partitions>60, 67, 83, 131, 145, 147, 243, 260, 290, 375, 395, 417, 528</partitions>
306
+ </server>
307
+ <server>
308
+ <id>38</id>
309
+ <host>voldemort38.example.com</host>
310
+ <http-port>8081</http-port>
311
+ <socket-port>6666</socket-port>
312
+ <admin-port>6667</admin-port>
313
+ <partitions>42, 58, 115, 169, 200, 203, 256, 279, 312, 317, 391, 422, 455</partitions>
314
+ </server>
315
+ <server>
316
+ <id>39</id>
317
+ <host>voldemort39.example.com</host>
318
+ <http-port>8081</http-port>
319
+ <socket-port>6666</socket-port>
320
+ <admin-port>6667</admin-port>
321
+ <partitions>8, 28, 34, 51, 87, 110, 160, 218, 272, 363, 402, 406, 532</partitions>
322
+ </server>
323
+ </cluster>