Skip to content

Commit 18696df

Browse files
committed
net: set default highwatermark at socket creation time
1 parent b68fa59 commit 18696df

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

doc/api/http.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -3249,7 +3249,8 @@ changes:
32493249
* `highWaterMark` {number} Optionally overrides all `socket`s'
32503250
`readableHighWaterMark` and `writableHighWaterMark`. This affects
32513251
`highWaterMark` property of both `IncomingMessage` and `ServerResponse`.
3252-
**Default:** See [`stream.getDefaultHighWaterMark()`][].
3252+
**Default:** `undefined`. Sockets will use the default watermark value
3253+
at the time the request arrives. See [`stream.getDefaultHighWaterMark()`][].
32533254
* `insecureHTTPParser` {boolean} Use an insecure HTTP parser that accepts
32543255
invalid HTTP headers when `true`. Using the insecure parser should be
32553256
avoided. See [`--insecure-http-parser`][] for more information.

lib/net.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ const {
156156
startPerf,
157157
stopPerf,
158158
} = require('internal/perf/observe');
159-
const { getDefaultHighWaterMark } = require('internal/streams/state');
160159

161160
function getFlags(ipv6Only) {
162161
return ipv6Only === true ? TCPConstants.UV_TCP_IPV6ONLY : 0;
@@ -1735,11 +1734,8 @@ function Server(options, connectionListener) {
17351734
if (typeof options.highWaterMark !== 'undefined') {
17361735
validateNumber(
17371736
options.highWaterMark, 'options.highWaterMark',
1737+
0,
17381738
);
1739-
1740-
if (options.highWaterMark < 0) {
1741-
options.highWaterMark = getDefaultHighWaterMark();
1742-
}
17431739
}
17441740

17451741
this._connections = 0;
@@ -1755,7 +1751,7 @@ function Server(options, connectionListener) {
17551751
this.noDelay = Boolean(options.noDelay);
17561752
this.keepAlive = Boolean(options.keepAlive);
17571753
this.keepAliveInitialDelay = ~~(options.keepAliveInitialDelay / 1000);
1758-
this.highWaterMark = options.highWaterMark ?? getDefaultHighWaterMark();
1754+
this.highWaterMark = options.highWaterMark;
17591755
}
17601756
ObjectSetPrototypeOf(Server.prototype, EventEmitter.prototype);
17611757
ObjectSetPrototypeOf(Server, EventEmitter);

test/parallel/test-http-server-options-highwatermark.js

+22-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const assert = require('assert');
55
const http = require('http');
66
const { kHighWaterMark } = require('_http_outgoing');
77

8-
const { getDefaultHighWaterMark } = require('internal/streams/state');
8+
const { setDefaultHighWaterMark } = require('internal/streams/state');
99

1010
function listen(server) {
1111
server.listen(0, common.mustCall(() => {
@@ -20,28 +20,44 @@ function listen(server) {
2020
}));
2121
}
2222

23+
// Test `options.highWaterMark` fails if less than zero.
2324
{
25+
assert.throws(() => {
26+
http.createServer({
27+
highWaterMark: -1,
28+
});
29+
}, { code: 'ERR_OUT_OF_RANGE' });
30+
}
31+
32+
// Test socket watermark is set with the value in `options.highWaterMark`.
33+
{
34+
const waterMarkValue = 17000;
35+
const serverWaterMarkValue = 14000;
2436
const server = http.createServer({
25-
highWaterMark: getDefaultHighWaterMark() * 2,
37+
highWaterMark: serverWaterMarkValue,
2638
}, common.mustCall((req, res) => {
27-
assert.strictEqual(req._readableState.highWaterMark, getDefaultHighWaterMark() * 2);
28-
assert.strictEqual(res[kHighWaterMark], getDefaultHighWaterMark() * 2);
39+
assert.strictEqual(req._readableState.highWaterMark, serverWaterMarkValue);
40+
assert.strictEqual(res[kHighWaterMark], serverWaterMarkValue);
2941
res.statusCode = 200;
3042
res.end();
3143
}));
3244

45+
setDefaultHighWaterMark(false, waterMarkValue);
3346
listen(server);
3447
}
3548

49+
// Test socket watermark is the default if `highWaterMark` in `options` is unset.
3650
{
51+
const waterMarkValue = 13000;
3752
const server = http.createServer(
3853
common.mustCall((req, res) => {
39-
assert.strictEqual(req._readableState.highWaterMark, getDefaultHighWaterMark());
40-
assert.strictEqual(res[kHighWaterMark], getDefaultHighWaterMark());
54+
assert.strictEqual(req._readableState.highWaterMark, waterMarkValue);
55+
assert.strictEqual(res[kHighWaterMark], waterMarkValue);
4156
res.statusCode = 200;
4257
res.end();
4358
})
4459
);
4560

61+
setDefaultHighWaterMark(false, waterMarkValue);
4662
listen(server);
4763
}

0 commit comments

Comments
 (0)