Description
Hello,
Background
We are using needle
in one of our projects and we have noticed a slow but steady increase in the tcp memory buffers. The linux command used to view the tcp memory pages allocation is cat /proc/net/sockstat
.
Every time we killed the service, the memory consumption dropped significantly so we started digging.
Before kill:
After kill:
After plenty of tests we started noticing that the needle streams we use, do not fire the close
event. Now, I am not sure where exactly the problem is, but if the close
event does not fire, it means that the underlying resources have not been destroyed. If they are not getting destroyed than that is consistent with the tcp memory pages increase we have been seeing.
How to reproduce
The following sample code shows the problem:
const needle = require('needle');
const {pipeline} = require('stream');
const {createWriteStream} = require('fs');
const url = 'https://releases.ubuntu.com/21.04/ubuntu-21.04-desktop-amd64.iso.torrent';
const readStream = needle.get(url);
readStream.on('end', () => console.log('needle END event fired')); // FIRES JUST FINE
readStream.on('close', () => console.log('needle CLOSE event fired')); // DOES NOT FIRE
const writeStream = createWriteStream('ubuntu-21.04-desktop-amd64.iso.torrent');
pipeline(readStream, writeStream, (error) => {
if (error) {
console.log(error);
}
// By uncommenting the next line, the CLOSE event WILL fire, but it shouldn't be required.
// readStream.destroy();
});
Environment
node.js version: v12.16.1
needle version: v2.8.0
Please let me know if I can help in any other way to get to the bottom of this. Thank you for your time.