tchannel 3.6.14 → 3.6.24
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.
- package/as/http.js +2 -2
- package/benchmarks/Makefile +5 -1
- package/benchmarks/index.js +1 -0
- package/benchmarks/multi_bench.js +15 -1
- package/channel.js +18 -5
- package/hyperbahn-client.js +3 -1
- package/lazy_relay.js +167 -24
- package/lib/object_pool.js +209 -0
- package/package.json +4 -4
- package/peer.js +143 -6
- package/peer_heap.js +52 -36
- package/relay_handler.js +4 -1
- package/service-name-handler.js +4 -1
- package/stat-tags.js +24 -1
- package/sub_peers.js +79 -9
- package/test/index.js +2 -0
- package/test/lazy_conn_handler.js +6 -2
- package/test/lazy_handler.js +6 -2
- package/test/lib/alloc-cluster.js +27 -1
- package/test/lib/batch-client.js +17 -2
- package/test/object_pool.js +119 -0
- package/test/peer-to-peer-load-balance.js +459 -0
- package/test/relay_lazy.js +2 -1
- package/test/v2/call.js +1 -0
- package/test/v2/lazy_frame.js +17 -12
- package/v2/args.js +28 -29
- package/v2/call.js +108 -68
- package/v2/checksum.js +2 -2
- package/v2/cont.js +19 -18
- package/v2/error_response.js +6 -8
- package/v2/frame.js +16 -14
- package/v2/handler.js +4 -1
- package/v2/header.js +30 -29
- package/v2/init.js +10 -12
- package/v2/tracing.js +21 -20
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
// Copyright (c) 2015 Uber Technologies, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
// in the Software without restriction, including without limitation the rights
|
|
6
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
// THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
'use strict';
|
|
22
|
+
|
|
23
|
+
var collectParallel = require('collect-parallel/array');
|
|
24
|
+
var metrics = require('metrics');
|
|
25
|
+
|
|
26
|
+
var allocCluster = require('./lib/alloc-cluster.js');
|
|
27
|
+
var BatchClient = require('./lib/batch-client.js');
|
|
28
|
+
var CollapsedAssert = require('./lib/collapsed-assert.js');
|
|
29
|
+
|
|
30
|
+
allocCluster.test('p2p requests from 40 -> 40', {
|
|
31
|
+
numPeers: 80
|
|
32
|
+
}, function t(cluster, assert) {
|
|
33
|
+
setup(cluster);
|
|
34
|
+
|
|
35
|
+
collectParallel(cluster.batches, function runRequests(batch, _, cb) {
|
|
36
|
+
batch.sendRequests(cb);
|
|
37
|
+
}, onBatches);
|
|
38
|
+
|
|
39
|
+
/*eslint max-statements: [2, 40]*/
|
|
40
|
+
function onBatches(err, results) {
|
|
41
|
+
var cassert = CollapsedAssert();
|
|
42
|
+
cassert.ifError(err);
|
|
43
|
+
|
|
44
|
+
var statuses = [];
|
|
45
|
+
for (var i = 0; i < results.length; i++) {
|
|
46
|
+
cassert.ifError(results[i].err, 'expect no batch error');
|
|
47
|
+
cassert.ifError(results[i].value.errors.length > 0,
|
|
48
|
+
'expect zero errors in batch');
|
|
49
|
+
statuses.push(results[i].value);
|
|
50
|
+
}
|
|
51
|
+
cassert.report(assert, 'expected no errors');
|
|
52
|
+
|
|
53
|
+
var statusTable = findServerHostDistribution(statuses);
|
|
54
|
+
|
|
55
|
+
var uniqHosts = Object.keys(statusTable);
|
|
56
|
+
if (uniqHosts.length < 35) {
|
|
57
|
+
checkConnections();
|
|
58
|
+
checkDistributions(statusTable);
|
|
59
|
+
} else {
|
|
60
|
+
assert.ok(true, 'SKIP: suprisingly large number of peers reached');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
assert.end();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function checkConnections() {
|
|
67
|
+
var cassert = CollapsedAssert();
|
|
68
|
+
var distribution = new metrics.Histogram();
|
|
69
|
+
for (var i = 0; i < cluster.batches.length; i++) {
|
|
70
|
+
var connCount = countConnections(cluster.batches[i]);
|
|
71
|
+
distribution.update(connCount);
|
|
72
|
+
|
|
73
|
+
cassert.ok(
|
|
74
|
+
connCount >= 1 &&
|
|
75
|
+
connCount <= 5,
|
|
76
|
+
'expected a small number of connections'
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
var info = distribution.printObj();
|
|
81
|
+
cassert.ok(info.min <= 2, 'expected low minimum');
|
|
82
|
+
cassert.ok(info.max <= 5, 'expected low maximum');
|
|
83
|
+
cassert.ok(info.sum <= 100, 'expected low total connections');
|
|
84
|
+
cassert.ok(info.p75 <= 2, 'expected low p75');
|
|
85
|
+
// console.log('conn distribution', info);
|
|
86
|
+
|
|
87
|
+
cassert.report(assert, 'expected batch connections to be fine');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function checkDistributions(statusTable) {
|
|
91
|
+
var uniqHosts = Object.keys(statusTable);
|
|
92
|
+
assert.ok(uniqHosts.length <= 35,
|
|
93
|
+
'Expected host reached (' + uniqHosts.length + ') to <= 35');
|
|
94
|
+
|
|
95
|
+
var distribution = new metrics.Histogram();
|
|
96
|
+
for (var i = 0; i < uniqHosts.length; i++) {
|
|
97
|
+
distribution.update(statusTable[uniqHosts[i]]);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var info = distribution.printObj();
|
|
101
|
+
|
|
102
|
+
var cassert = CollapsedAssert();
|
|
103
|
+
cassert.ok(info.min <= 50,
|
|
104
|
+
'expected minimum to be no more then 50'
|
|
105
|
+
);
|
|
106
|
+
cassert.equal(info.sum, 2000,
|
|
107
|
+
'expected 2000 requests to be made'
|
|
108
|
+
);
|
|
109
|
+
cassert.ok(info.median >= 48,
|
|
110
|
+
'expected median (' + info.median + ') to be larger then 49'
|
|
111
|
+
);
|
|
112
|
+
cassert.ok(info.max >= 100, 'expected maximum to be huge');
|
|
113
|
+
cassert.ok(info.p75 >= 50, 'expected P75 to be huge');
|
|
114
|
+
cassert.ok(info.p95 > 80, 'expected P95 to be huge');
|
|
115
|
+
cassert.ok(info.variance >= 500,
|
|
116
|
+
'expected variance (' + info.variance + ') to be huge'
|
|
117
|
+
);
|
|
118
|
+
// console.log('conn distribution', info);
|
|
119
|
+
|
|
120
|
+
cassert.report(assert, 'expected request distribution to be ok');
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
allocCluster.test('p2p requests from 40 -> 40 with minConnections', {
|
|
125
|
+
numPeers: 80,
|
|
126
|
+
channelOptions: {
|
|
127
|
+
choosePeerWithHeap: true
|
|
128
|
+
}
|
|
129
|
+
}, function t(cluster, assert) {
|
|
130
|
+
setup(cluster, {
|
|
131
|
+
minConnections: 10
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
collectParallel(cluster.batches, function runRequests(batch, _, cb) {
|
|
135
|
+
batch.sendRequests(cb);
|
|
136
|
+
}, onBatches);
|
|
137
|
+
|
|
138
|
+
/*eslint max-statements: [2, 40]*/
|
|
139
|
+
function onBatches(err, results) {
|
|
140
|
+
var cassert = CollapsedAssert();
|
|
141
|
+
cassert.ifError(err);
|
|
142
|
+
|
|
143
|
+
var statuses = [];
|
|
144
|
+
for (var i = 0; i < results.length; i++) {
|
|
145
|
+
cassert.ifError(results[i].err, 'expect no batch error');
|
|
146
|
+
cassert.ifError(results[i].value.errors.length > 0,
|
|
147
|
+
'expect zero errors in batch');
|
|
148
|
+
statuses.push(results[i].value);
|
|
149
|
+
}
|
|
150
|
+
cassert.report(assert, 'expected no errors');
|
|
151
|
+
|
|
152
|
+
var statusTable = findServerHostDistribution(statuses);
|
|
153
|
+
|
|
154
|
+
cassert = verifyConnections(cluster, 10, 12);
|
|
155
|
+
cassert.report(assert, 'expected batch connections to be fine');
|
|
156
|
+
|
|
157
|
+
cassert = verifyDistributions(statusTable, {
|
|
158
|
+
min: 40,
|
|
159
|
+
sum: 2000,
|
|
160
|
+
median: [40, 60],
|
|
161
|
+
mean: [45, 55],
|
|
162
|
+
max: 120,
|
|
163
|
+
p75: [55, 70],
|
|
164
|
+
p95: 100,
|
|
165
|
+
variance: 500
|
|
166
|
+
});
|
|
167
|
+
cassert.report(assert, 'expected request distribution to be ok');
|
|
168
|
+
|
|
169
|
+
assert.end();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
allocCluster.test('p2p requests where minConns > no of servers', {
|
|
174
|
+
numPeers: 45,
|
|
175
|
+
channelOptions: {
|
|
176
|
+
choosePeerWithHeap: true
|
|
177
|
+
}
|
|
178
|
+
}, function t(cluster, assert) {
|
|
179
|
+
setup(cluster, {
|
|
180
|
+
minConnections: 6,
|
|
181
|
+
servers: 5
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
collectParallel(cluster.batches, function runRequests(batch, _, cb) {
|
|
185
|
+
batch.sendRequests(cb);
|
|
186
|
+
}, onBatches);
|
|
187
|
+
|
|
188
|
+
/*eslint max-statements: [2, 40]*/
|
|
189
|
+
function onBatches(err, results) {
|
|
190
|
+
var cassert = CollapsedAssert();
|
|
191
|
+
cassert.ifError(err);
|
|
192
|
+
|
|
193
|
+
var statuses = [];
|
|
194
|
+
for (var i = 0; i < results.length; i++) {
|
|
195
|
+
cassert.ifError(results[i].err, 'expect no batch error');
|
|
196
|
+
cassert.ifError(results[i].value.errors.length > 0,
|
|
197
|
+
'expect zero errors in batch');
|
|
198
|
+
|
|
199
|
+
statuses.push(results[i].value);
|
|
200
|
+
}
|
|
201
|
+
cassert.report(assert, 'expected no errors');
|
|
202
|
+
|
|
203
|
+
var statusTable = findServerHostDistribution(statuses);
|
|
204
|
+
|
|
205
|
+
cassert = verifyConnections(cluster, 5, 5);
|
|
206
|
+
cassert.report(assert, 'expected batch connections to be fine');
|
|
207
|
+
|
|
208
|
+
cassert = verifyDistributions(statusTable, {
|
|
209
|
+
min: 395,
|
|
210
|
+
sum: 2000,
|
|
211
|
+
median: [380, 420],
|
|
212
|
+
mean: [395, 405],
|
|
213
|
+
max: 500,
|
|
214
|
+
p75: [400, 450],
|
|
215
|
+
p95: 475
|
|
216
|
+
});
|
|
217
|
+
cassert.report(assert, 'expected request distribution to be ok');
|
|
218
|
+
|
|
219
|
+
assert.end();
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
allocCluster.test('p2p requests where half of servers down', {
|
|
224
|
+
numPeers: 48,
|
|
225
|
+
channelOptions: {
|
|
226
|
+
choosePeerWithHeap: true
|
|
227
|
+
}
|
|
228
|
+
}, function t(cluster, assert) {
|
|
229
|
+
cluster.logger.whitelist('info', 'resetting connection');
|
|
230
|
+
|
|
231
|
+
setup(cluster, {
|
|
232
|
+
minConnections: 5,
|
|
233
|
+
servers: 8,
|
|
234
|
+
retryLimit: 2
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Close half the servers...
|
|
238
|
+
for (var j = 0; j < cluster.servers.length / 2; j++) {
|
|
239
|
+
cluster.servers[j * 2].close();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
collectParallel(cluster.batches, function runRequests(batch, _, cb) {
|
|
243
|
+
batch.sendRequests(cb);
|
|
244
|
+
}, onBatches);
|
|
245
|
+
|
|
246
|
+
/*eslint max-statements: [2, 40]*/
|
|
247
|
+
function onBatches(err, results) {
|
|
248
|
+
var cassert = CollapsedAssert();
|
|
249
|
+
cassert.ifError(err);
|
|
250
|
+
|
|
251
|
+
var statuses = [];
|
|
252
|
+
for (var i = 0; i < results.length; i++) {
|
|
253
|
+
cassert.ifError(results[i].err, 'expect no batch error');
|
|
254
|
+
cassert.ifError(results[i].value.errors.length > 5,
|
|
255
|
+
'expect at most five error in batch(' +
|
|
256
|
+
results[i].value.errors.length + ')');
|
|
257
|
+
|
|
258
|
+
statuses.push(results[i].value);
|
|
259
|
+
}
|
|
260
|
+
cassert.report(assert, 'expected no errors');
|
|
261
|
+
|
|
262
|
+
var statusTable = findServerHostDistribution(statuses);
|
|
263
|
+
|
|
264
|
+
cassert = verifyConnections(cluster, 4, 4);
|
|
265
|
+
cassert.report(assert, 'expected batch connections to be fine');
|
|
266
|
+
|
|
267
|
+
cassert = verifyDistributions(statusTable, {
|
|
268
|
+
min: 495,
|
|
269
|
+
sum: [1985, 2000],
|
|
270
|
+
median: [480, 520],
|
|
271
|
+
mean: [495, 505],
|
|
272
|
+
max: 600,
|
|
273
|
+
p75: [500, 575],
|
|
274
|
+
p95: 600
|
|
275
|
+
});
|
|
276
|
+
cassert.report(assert, 'expected request distribution to be ok');
|
|
277
|
+
|
|
278
|
+
var logs = cluster.logger.items();
|
|
279
|
+
assert.ok(logs.length <= 280 + 160,
|
|
280
|
+
'expected conn reset logs (' + logs.length + ') to be <= 420');
|
|
281
|
+
|
|
282
|
+
assert.end();
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
function findServerHostDistribution(statuses) {
|
|
287
|
+
var statusTable = {};
|
|
288
|
+
for (var i = 0; i < statuses.length; i++) {
|
|
289
|
+
var records = statuses[i].results;
|
|
290
|
+
for (var j = 0; j < records.length; j++) {
|
|
291
|
+
var record = records[j];
|
|
292
|
+
if (!statusTable[record.outReqHostPort]) {
|
|
293
|
+
statusTable[record.outReqHostPort] = 0;
|
|
294
|
+
}
|
|
295
|
+
statusTable[record.outReqHostPort]++;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return statusTable;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function countConnections(batchClient) {
|
|
302
|
+
var subChannel = batchClient.subChannel;
|
|
303
|
+
var peers = subChannel.peers.values();
|
|
304
|
+
|
|
305
|
+
var conns = [];
|
|
306
|
+
for (var i = 0; i < peers.length; i++) {
|
|
307
|
+
var peer = peers[i];
|
|
308
|
+
for (var j = 0; j < peer.connections.length; j++) {
|
|
309
|
+
conns.push(peer.connections[j]);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return conns.length;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function verifyConnections(cluster, min, max) {
|
|
317
|
+
var MIN = min;
|
|
318
|
+
var MAX = max;
|
|
319
|
+
var COUNT = cluster.batches.length;
|
|
320
|
+
|
|
321
|
+
var cassert = CollapsedAssert();
|
|
322
|
+
var distribution = new metrics.Histogram();
|
|
323
|
+
for (var i = 0; i < cluster.batches.length; i++) {
|
|
324
|
+
var connCount = countConnections(cluster.batches[i]);
|
|
325
|
+
distribution.update(connCount);
|
|
326
|
+
|
|
327
|
+
cassert.ok(
|
|
328
|
+
connCount >= MIN &&
|
|
329
|
+
connCount <= MAX,
|
|
330
|
+
'expected connections(' + connCount + ') to be ' +
|
|
331
|
+
'>= ' + MIN + ' and <= ' + MAX
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
var info = distribution.printObj();
|
|
336
|
+
cassert.ok(info.min <= MAX,
|
|
337
|
+
'expected min connections(' + info.min + ') to be <= ' + MAX);
|
|
338
|
+
cassert.ok(info.max >= MIN,
|
|
339
|
+
'expected max conns(' + info.max + ') to be >= ' + MIN);
|
|
340
|
+
cassert.ok(info.sum >= COUNT * MIN,
|
|
341
|
+
'expected sum of conns(' + info.sum + ') to be at ' +
|
|
342
|
+
COUNT * MIN + ' conns');
|
|
343
|
+
cassert.ok(info.p75 <= MAX,
|
|
344
|
+
'expected p75(' + info.p75 + ') to be <= ' + MAX);
|
|
345
|
+
|
|
346
|
+
return cassert;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function verifyDistributions(statusTable, opts) {
|
|
350
|
+
var uniqHosts = Object.keys(statusTable);
|
|
351
|
+
|
|
352
|
+
var distribution = new metrics.Histogram();
|
|
353
|
+
for (var i = 0; i < uniqHosts.length; i++) {
|
|
354
|
+
distribution.update(statusTable[uniqHosts[i]]);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
var info = distribution.printObj();
|
|
358
|
+
|
|
359
|
+
var cassert = CollapsedAssert();
|
|
360
|
+
cassert.ok(info.min <= opts.min,
|
|
361
|
+
'expected minimum(' + info.min + ') to be no more then ' + opts.min
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
if (Array.isArray(opts.sum)) {
|
|
365
|
+
cassert.ok(
|
|
366
|
+
info.sum >= opts.sum[0] &&
|
|
367
|
+
info.sum <= opts.sum[1],
|
|
368
|
+
'expected sum(' + info.sum + ') to be within ' +
|
|
369
|
+
opts.sum[0] + ' & ' + opts.sum[1]
|
|
370
|
+
);
|
|
371
|
+
} else {
|
|
372
|
+
cassert.equal(info.sum, opts.sum,
|
|
373
|
+
'expected sum(' + info.sum + ') to be ' + opts.sum
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
cassert.ok(
|
|
378
|
+
info.median >= opts.median[0] &&
|
|
379
|
+
info.median <= opts.median[1],
|
|
380
|
+
'expected median(' + info.median + ') to be within ' +
|
|
381
|
+
opts.median[0] + ' & ' + opts.median[1]
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
cassert.ok(
|
|
385
|
+
info.mean >= opts.mean[0] &&
|
|
386
|
+
info.mean <= opts.mean[1],
|
|
387
|
+
'expected mean(' + info.mean + ') to be within ' +
|
|
388
|
+
opts.mean[0] + ' & ' + opts.mean[1]
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
cassert.ok(info.max <= opts.max,
|
|
392
|
+
'expected maximum(' + info.max + ') to no more then ' + opts.max
|
|
393
|
+
);
|
|
394
|
+
cassert.ok(
|
|
395
|
+
info.p75 >= opts.p75[0] &&
|
|
396
|
+
info.p75 <= opts.p75[1],
|
|
397
|
+
'expected P75(' + info.p75 + ') to be within ' +
|
|
398
|
+
opts.p75[0] + ' & ' + opts.p75[1]
|
|
399
|
+
);
|
|
400
|
+
cassert.ok(info.p95 <= opts.p95,
|
|
401
|
+
'expected P95 (' + info.p95 + ') to be less than ' + opts.p95
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
if (opts.variance) {
|
|
405
|
+
cassert.ok(info.variance <= opts.variance,
|
|
406
|
+
'expected variance(' + info.variance + ') to be less than ' + opts.variance
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return cassert;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function setup(cluster, opts) {
|
|
414
|
+
opts = opts || {};
|
|
415
|
+
var NUM_CLIENTS = opts.clients || 40;
|
|
416
|
+
var NUM_SERVERS = opts.servers || cluster.channels.length - NUM_CLIENTS;
|
|
417
|
+
|
|
418
|
+
cluster.clients = cluster.channels.slice(0, NUM_CLIENTS);
|
|
419
|
+
cluster.servers = cluster.channels.slice(
|
|
420
|
+
NUM_CLIENTS, NUM_CLIENTS + NUM_SERVERS
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
var i;
|
|
424
|
+
for (i = 0; i < cluster.servers.length; i++) {
|
|
425
|
+
makeServer(cluster.servers[i], i);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
cluster.serverHosts = [];
|
|
429
|
+
for (i = 0; i < cluster.servers.length; i++) {
|
|
430
|
+
cluster.serverHosts.push(cluster.servers[i].hostPort);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
cluster.batches = [];
|
|
434
|
+
for (i = 0; i < cluster.clients.length; i++) {
|
|
435
|
+
cluster.batches.push(new BatchClient(
|
|
436
|
+
cluster.clients[i], cluster.serverHosts, {
|
|
437
|
+
delay: 40,
|
|
438
|
+
batchSize: 1,
|
|
439
|
+
timeout: 1000,
|
|
440
|
+
totalRequests: 50,
|
|
441
|
+
minConnections: opts.minConnections || null,
|
|
442
|
+
retryLimit: opts.retryLimit || null
|
|
443
|
+
}
|
|
444
|
+
));
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function makeServer(channel, index) {
|
|
449
|
+
var chanNum = index + 1;
|
|
450
|
+
|
|
451
|
+
var serverChan = channel.makeSubChannel({
|
|
452
|
+
serviceName: 'server'
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
serverChan.register('echo', function echo(req, res, arg2, arg3) {
|
|
456
|
+
res.headers.as = 'raw';
|
|
457
|
+
res.sendOk(arg2, arg3 + ' served by ' + chanNum);
|
|
458
|
+
});
|
|
459
|
+
}
|
package/test/relay_lazy.js
CHANGED
|
@@ -301,6 +301,7 @@ allocCluster.test('lazy relay request times out', {
|
|
|
301
301
|
|
|
302
302
|
var relayOutPeer = relayChan.peers.get(dest.hostPort);
|
|
303
303
|
relayOutPeer.waitForIdentified = function punchWaitForIdentified() {
|
|
304
|
+
return -1;
|
|
304
305
|
};
|
|
305
306
|
|
|
306
307
|
sourceChan.request({
|
|
@@ -442,7 +443,7 @@ allocCluster.test('relay request handles channel close correctly', {
|
|
|
442
443
|
'tchannel.connection.reset',
|
|
443
444
|
'expected connection error');
|
|
444
445
|
assert.notOk(res, 'expected no response');
|
|
445
|
-
finish
|
|
446
|
+
process.nextTick(finish);
|
|
446
447
|
}
|
|
447
448
|
|
|
448
449
|
function finish() {
|
package/test/v2/call.js
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
var test = require('tape');
|
|
24
24
|
var testRW = require('bufrw/test_rw');
|
|
25
|
+
var Frame = require('../../v2/frame.js');
|
|
25
26
|
var Call = require('../../v2/call.js');
|
|
26
27
|
var Checksum = require('../../v2/checksum.js');
|
|
27
28
|
var Tracing = require('../../v2/tracing.js');
|
package/test/v2/lazy_frame.js
CHANGED
|
@@ -26,6 +26,11 @@ var test = require('tape');
|
|
|
26
26
|
var testRW = require('bufrw/test_rw');
|
|
27
27
|
var process = global.process;
|
|
28
28
|
|
|
29
|
+
var ReadResult = require('bufrw').ReadResult;
|
|
30
|
+
var WriteResult = require('bufrw').WriteResult;
|
|
31
|
+
var readRes = new ReadResult();
|
|
32
|
+
var writeRes = new WriteResult();
|
|
33
|
+
|
|
29
34
|
var TestBody = require('./lib/test_body.js');
|
|
30
35
|
var v2 = require('../../v2/index.js');
|
|
31
36
|
|
|
@@ -495,7 +500,7 @@ test('CallRequest.RW.lazy', function t(assert) {
|
|
|
495
500
|
|
|
496
501
|
// validate call req lazy reading
|
|
497
502
|
assertReadRes(
|
|
498
|
-
v2.CallRequest.RW.lazy.
|
|
503
|
+
v2.CallRequest.RW.lazy.poolReadFlags(readRes, lazyFrame),
|
|
499
504
|
frame.body.flags,
|
|
500
505
|
'CallRequest.RW.lazy.readFlags');
|
|
501
506
|
assert.equal(
|
|
@@ -503,15 +508,15 @@ test('CallRequest.RW.lazy', function t(assert) {
|
|
|
503
508
|
frame.body.ttl,
|
|
504
509
|
'CallRequest.RW.lazy.readTTL');
|
|
505
510
|
assertReadRes(
|
|
506
|
-
v2.CallRequest.RW.lazy.
|
|
511
|
+
v2.CallRequest.RW.lazy.poolReadTracing(readRes, lazyFrame),
|
|
507
512
|
tracing,
|
|
508
513
|
'CallRequest.RW.lazy.readTracing');
|
|
509
514
|
assertReadRes(
|
|
510
|
-
v2.CallRequest.RW.lazy.
|
|
515
|
+
v2.CallRequest.RW.lazy.poolReadService(readRes, lazyFrame),
|
|
511
516
|
frame.body.service,
|
|
512
517
|
'CallRequest.RW.lazy.readService');
|
|
513
518
|
assertReadRes(
|
|
514
|
-
v2.CallRequest.RW.lazy.
|
|
519
|
+
v2.CallRequest.RW.lazy.poolReadArg1(readRes, lazyFrame),
|
|
515
520
|
Buffer(frame.body.args[0]),
|
|
516
521
|
'CallRequest.RW.lazy.readArg1');
|
|
517
522
|
assert.equal(
|
|
@@ -520,7 +525,7 @@ test('CallRequest.RW.lazy', function t(assert) {
|
|
|
520
525
|
'CallRequest.RW.lazy.isFrameTerminal');
|
|
521
526
|
|
|
522
527
|
// validate lazy header reading
|
|
523
|
-
var res = v2.CallRequest.RW.lazy.
|
|
528
|
+
var res = v2.CallRequest.RW.lazy.poolReadHeaders(readRes, lazyFrame);
|
|
524
529
|
assert.ifError(res.err, 'no error from v2.CallRequest.RW.lazy.readHeaders');
|
|
525
530
|
var headers = res.value;
|
|
526
531
|
if (headers) {
|
|
@@ -545,7 +550,7 @@ test('CallRequest.RW.lazy', function t(assert) {
|
|
|
545
550
|
'expected header "as" => "plumber"');
|
|
546
551
|
// readArg1 can re-use readHeaders work
|
|
547
552
|
assertReadRes(
|
|
548
|
-
v2.CallRequest.RW.lazy.
|
|
553
|
+
v2.CallRequest.RW.lazy.poolReadArg1(readRes, lazyFrame, headers),
|
|
549
554
|
Buffer(frame.body.args[0]),
|
|
550
555
|
'CallRequest.RW.lazy.readArg1, with headers');
|
|
551
556
|
}
|
|
@@ -553,7 +558,7 @@ test('CallRequest.RW.lazy', function t(assert) {
|
|
|
553
558
|
// validate call req lazy writing
|
|
554
559
|
var newTTL = frame.body.ttl - 15;
|
|
555
560
|
assert.ifError(
|
|
556
|
-
v2.CallRequest.RW.lazy.
|
|
561
|
+
v2.CallRequest.RW.lazy.poolWriteTTL(writeRes, newTTL, lazyFrame).err,
|
|
557
562
|
'no error from v2.CallRequest.RW.lazy.writeTTL');
|
|
558
563
|
var newFrame = bufrw.fromBuffer(v2.Frame.RW, lazyFrame.buffer);
|
|
559
564
|
assert.equal(
|
|
@@ -600,11 +605,11 @@ test('CallResponse.RW.lazy', function t(assert) {
|
|
|
600
605
|
|
|
601
606
|
// validate call res lazy reading
|
|
602
607
|
assertReadRes(
|
|
603
|
-
v2.CallResponse.RW.lazy.
|
|
608
|
+
v2.CallResponse.RW.lazy.poolReadFlags(readRes, lazyFrame),
|
|
604
609
|
frame.body.flags,
|
|
605
610
|
'CallResponse.RW.lazy.readFlags');
|
|
606
611
|
assertReadRes(
|
|
607
|
-
v2.CallResponse.RW.lazy.
|
|
612
|
+
v2.CallResponse.RW.lazy.poolReadTracing(readRes, lazyFrame),
|
|
608
613
|
tracing,
|
|
609
614
|
'CallResponse.RW.lazy.readTracing');
|
|
610
615
|
assert.equal(
|
|
@@ -612,12 +617,12 @@ test('CallResponse.RW.lazy', function t(assert) {
|
|
|
612
617
|
!(frame.body.flags & v2.CallFlags.Fragment),
|
|
613
618
|
'CallResponse.RW.lazy.isFrameTerminal');
|
|
614
619
|
assertReadRes(
|
|
615
|
-
v2.CallResponse.RW.lazy.
|
|
620
|
+
v2.CallResponse.RW.lazy.poolReadArg1(readRes, lazyFrame),
|
|
616
621
|
Buffer(frame.body.args[0]),
|
|
617
622
|
'CallResponse.RW.lazy.readArg1');
|
|
618
623
|
|
|
619
624
|
// validate lazy header reading
|
|
620
|
-
var res = v2.CallResponse.RW.lazy.
|
|
625
|
+
var res = v2.CallResponse.RW.lazy.poolReadHeaders(readRes, lazyFrame);
|
|
621
626
|
assert.ifError(res.err, 'no error from v2.CallResponse.RW.lazy.readHeaders');
|
|
622
627
|
var headers = res.value;
|
|
623
628
|
if (headers) {
|
|
@@ -638,7 +643,7 @@ test('CallResponse.RW.lazy', function t(assert) {
|
|
|
638
643
|
'expected header "as" => "plumber"');
|
|
639
644
|
// readArg1 can re-use readHeaders work
|
|
640
645
|
assertReadRes(
|
|
641
|
-
v2.CallResponse.RW.lazy.
|
|
646
|
+
v2.CallResponse.RW.lazy.poolReadArg1(readRes, lazyFrame, headers),
|
|
642
647
|
Buffer(frame.body.args[0]),
|
|
643
648
|
'CallResponse.RW.lazy.readArg1, with headers');
|
|
644
649
|
}
|