Skip to content

net: add writeQueueSize #44157

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions doc/api/net.md
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,16 @@ added: v0.5.3

The amount of bytes sent.

### `socket.writeQueueSize`

<!-- YAML
added: REPLACEME
-->

* {integer}

The amount of bytes in libuv write queue.

### `socket.connect()`

Initiate a connection on a given socket.
Expand Down
3 changes: 3 additions & 0 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,9 @@ protoGetter('bytesWritten', function bytesWritten() {
return bytes;
});

protoGetter('writeQueueSize', function writeQueueSize() {
return this._handle ? this._handle.writeQueueSize : -1;
});

function checkBindError(err, port, handle) {
// EADDRINUSE may not be reported until we call listen() or connect().
Expand Down
31 changes: 31 additions & 0 deletions test/parallel/test-net-connect-write-queue-size.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const tmpdir = require('../common/tmpdir');

tmpdir.refresh();

const socket = new net.Socket();
assert.strictEqual(socket.writeQueueSize, -1);

const server = net.createServer()
.listen(common.PIPE, common.mustCall(() => {
// The pipe connection is a synchronous operation
// `net.connect` will set `socket.connecting` to true
const socket = net.connect(common.PIPE, common.mustCall(() => {
socket.destroy();
server.close();
}));
// Set connecting to false here to make `socket.write` can call into
// libuv directly (see `_writeGeneric` in `net.js`).
// because the socket is connecting currently in libuv, so libuv will
// insert the write request into write queue, then we can get the
// size of write queue by `socket.writeQueueSize`.
socket.connecting = false;
Copy link
Member

@lpinca lpinca Aug 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to test the feature without this hack? I mean, how would socket.writeQueueSize be used in the real world? The test should simulate that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is difficult to write the test, and i think this test is not good.writeQueueSize means how many bytes are waiting to write in libuv. and add socket._handle.writeQueueSize to the count of bytesWritten maybe a good idea. I'll take a look later, thanks !

const data = 'hello';
socket.write(data, 'utf-8', common.mustCall());
assert.strictEqual(socket.writeQueueSize, common.isWindows ? 0 : data.length);
// Restore it
socket.connecting = true;
}));