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.
@@ -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
+ }
@@ -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');
@@ -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.readFlags(lazyFrame),
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.readTracing(lazyFrame),
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.readService(lazyFrame),
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.readArg1(lazyFrame),
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.readHeaders(lazyFrame);
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.readArg1(lazyFrame, headers),
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.writeTTL(newTTL, lazyFrame).err,
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.readFlags(lazyFrame),
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.readTracing(lazyFrame),
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.readArg1(lazyFrame),
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.readHeaders(lazyFrame);
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.readArg1(lazyFrame, headers),
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
  }