em-voldemort 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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>