socket.destroySoon causes two EventEmitter memory leaks when repetitively using it on a socket that is trying to connect
Đang mở
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.4k
- Merge trung bình
- 4 ngày 3 giờ
- Pull request đã merge (30 ngày)
- 272
Mô tả
Version
v22.11.0
Platform
Darwin xxx.local 24.4.0 Darwin Kernel Version 24.4.0: Fri Apr 11 18:32:43 PDT 2025; root:xnu-11417.101.15~117/RELEASE_ARM64_T8103 arm64
Subsystem
net
What steps will reproduce the bug?
const { Socket } = require('node:net');
const socket = new Socket();
socket.on('error', (err) => {
console.log(`error: ${err.code}`);
});
socket.on('connect', () => {
console.log('connected');
});
socket.on('close', () => {
console.log('closed');
});
setInterval(() => {
socket.connect({ host: 'google.com', port: 5000 });
setTimeout(() => {
socket.destroySoon();
}, 5);
}, 100);
How often does it reproduce? Is there a required condition?
It reproduces always. Port 5000 is chosen as it times out.
What is the expected behavior? Why is that the expected behavior?
Seeing an infinite stream of
error: ECANCELED
closed
log lines
What do you see instead?
error: ECANCELED
closed
error: ECANCELED
closed
error: ECANCELED
closed
error: ECANCELED
closed
error: ECANCELED
closed
(node:46138) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added to [Socket]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
at genericNodeError (node:internal/errors:983:15)
at wrappedFn (node:internal/errors:537:14)
at _addListener (node:events:592:17)
at Socket.addListener (node:events:610:10)
at Readable.on (node:internal/streams/readable:1128:35)
at Socket.once (node:events:654:8)
at Socket.destroySoon (node:net:795:10)
at Timeout._onTimeout (/Users/robeverhardt/Downloads/test.js:17:12)
at listOnTimeout (node:internal/timers:594:17)
at process.processTimers (node:internal/timers:529:7)
error: ECANCELED
closed
error: ECANCELED
closed
error: ECANCELED
closed
error: ECANCELED
closed
(node:46138) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connect listeners added to [Socket]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
at genericNodeError (node:internal/errors:983:15)
at wrappedFn (node:internal/errors:537:14)
at _addListener (node:events:592:17)
at Socket.addListener (node:events:610:10)
at Readable.on (node:internal/streams/readable:1128:35)
at Socket.once (node:events:654:8)
at Socket._final (node:net:525:17)
at prefinish (node:internal/streams/writable:916:14)
at finishMaybe (node:internal/streams/writable:930:5)
at Writable.end (node:internal/streams/writable:845:5)
Additional information
No response
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với script tái hiện và các entry point của node:net được nêu trong stack trace, đặc biệt là Socket.destroySoon và Socket._final. Tái hiện các kết nối bị hủy lặp đi lặp lại, sau đó theo dõi cách các listener finish và connect được thêm vào và xóa đi. Được xem là hoàn tất khi kịch bản không còn tạo ra MaxListenersExceededWarning và có coverage cho regression.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, node.js
- Lĩnh vực
- networking
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Sôi nổi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 52/100