Skip to content

Commit 82f1d34

Browse files
indutnyisaacs
authored andcommitted
tls: make slab buffer's size configurable
see #4636
1 parent 5d3c51d commit 82f1d34

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

doc/api/tls.markdown

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,15 @@ You can test this server by connecting to it with `openssl s_client`:
214214
openssl s_client -connect 127.0.0.1:8000
215215

216216

217+
## tls.SLAB_BUFFER_SIZE
218+
219+
Size of slab buffer used by all tls servers and clients.
220+
Default: `10 * 1024 * 1024`.
221+
222+
223+
Don't change the defaults unless you know what you are doing.
224+
225+
217226
## tls.connect(options, [callback])
218227
## tls.connect(port, [host], [options], [callback])
219228

lib/tls.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ var DEFAULT_CIPHERS = 'ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:' + // TLS 1.2
3939
exports.CLIENT_RENEG_LIMIT = 3;
4040
exports.CLIENT_RENEG_WINDOW = 600;
4141

42+
exports.SLAB_BUFFER_SIZE = 10 * 1024 * 1024;
43+
4244

4345
var debug;
4446
if (process.env.NODE_DEBUG && /tls/.test(process.env.NODE_DEBUG)) {
@@ -201,7 +203,7 @@ function SlabBuffer() {
201203

202204
SlabBuffer.prototype.create = function create() {
203205
this.isFull = false;
204-
this.pool = new Buffer(10 * 1024 * 1024);
206+
this.pool = new Buffer(exports.SLAB_BUFFER_SIZE);
205207
this.offset = 0;
206208
this.remaining = this.pool.length;
207209
};
@@ -226,7 +228,7 @@ SlabBuffer.prototype.use = function use(context, fn) {
226228
};
227229

228230

229-
var slabBuffer = new SlabBuffer();
231+
var slabBuffer = null;
230232

231233

232234
// Base class of both CleartextStream and EncryptedStream
@@ -242,6 +244,7 @@ function CryptoStream(pair) {
242244
this._pending = [];
243245
this._pendingCallbacks = [];
244246
this._pendingBytes = 0;
247+
if (slabBuffer === null) slabBuffer = new SlabBuffer();
245248
this._buffer = slabBuffer;
246249
}
247250
util.inherits(CryptoStream, Stream);

test/simple/test-tls-server-slab.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Copyright Joyent, Inc. and other Node contributors.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a
4+
// copy of this software and associated documentation files (the
5+
// "Software"), to deal in the Software without restriction, including
6+
// without limitation the rights to use, copy, modify, merge, publish,
7+
// distribute, sublicense, and/or sell copies of the Software, and to permit
8+
// persons to whom the Software is furnished to do so, subject to the
9+
// following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included
12+
// in all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21+
22+
var common = require('../common');
23+
var assert = require('assert');
24+
var tls = require('tls');
25+
var fs = require('fs');
26+
27+
var clientConnected = 0;
28+
var serverConnected = 0;
29+
30+
var options = {
31+
key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
32+
cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem')
33+
};
34+
35+
tls.SLAB_BUFFER_SIZE = 100 * 1024;
36+
37+
var server = tls.Server(options, function(socket) {
38+
assert(socket._buffer.pool.length == tls.SLAB_BUFFER_SIZE);
39+
if (++serverConnected === 2) {
40+
server.close();
41+
}
42+
});
43+
44+
server.listen(common.PORT, function() {
45+
var client1 = tls.connect({
46+
port: common.PORT,
47+
rejectUnauthorized: false
48+
}, function() {
49+
++clientConnected;
50+
client1.end();
51+
});
52+
53+
var client2 = tls.connect({
54+
port: common.PORT,
55+
rejectUnauthorized: false
56+
});
57+
client2.on('secureConnect', function() {
58+
++clientConnected;
59+
client2.end();
60+
});
61+
});
62+
63+
process.on('exit', function() {
64+
assert.equal(clientConnected, 2);
65+
assert.equal(serverConnected, 2);
66+
});

0 commit comments

Comments
 (0)