error handler of same domain can be called several times when it throws
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: Current tip of master (66f45e7e5b), but probably applies to all versions.
- Platform: All platforms.
- Subsystem: domain.
The following code:
'use strict';
const common = require('../common');
const domain = require('domain');
const http = require('http');
const server = http.createServer((req, res) => {
res.end();
});
let numDomainErrorListenerCalls = 0;
function performHttpRequestWithDomain(cb) {
const d = domain.create();
d.run(() => {
const req = http.get({
host: '127.0.0.1', port: server.address().port
}, (res) => {
res.on('data', () => {});
res.on('end', () => {
throw new Error('bang');
});
});
req.end();
});
d.on('error', (domainErr) => {
console.log(++numDomainErrorListenerCalls);
throw new Error('boom');
});
}
server.listen(0, '127.0.0.1', () => {
performHttpRequestWithDomain(common.mustCall(() => {
server.close();
}));
});
gives the following output:
$ ./node test/parallel/test-http-req-domain-stack.js
1
2
/Users/jgilli/dev/node/test/parallel/test-http-req-domain-stack.js:30
throw new Error('boom');
^
Error: boom
at Domain.d.on (/Users/jgilli/dev/node/test/parallel/test-http-req-domain-stack.js:30:11)
at Domain.emit (events.js:188:13)
at Domain.EventEmitter.emit (domain.js:430:20)
at Domain._errorHandler (domain.js:216:23)
at Domain._errorHandler (domain.js:244:33)
at Object.setUncaughtExceptionCaptureCallback (domain.js:132:29)
at process._fatalException (internal/process/execution.js:102:29)
The uncaught exception is expected. What is not expected as far as I understand is for the same domain's error handler to run more than once.
I believe the original intention of the domain's implementation is to pop the domains stack when a domain's error handler throw, so that the domain that handles that new error is the "parent" domain.
However, in the example above the same domain is pushed on the stack more than once. For instance, when an event is emitted from a nextTick callback, the same domain will be entered from the nextTick callbacks scheduler and then once again from the event emitter.
Pushing the same domain on the stack more than once makes sense so that the components that push a domain can pop it from the stack. However, I think we could probably replace the call to pop the stack once in the domain error handling code to remove all consecutive instances of that domain instead.
@nodejs/domains Thoughts?
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 test/parallel/test-http-req-domain-stack.js và tái hiện các lần gọi lặp lại của error listener. Đọc lib/domain.js cùng với internal/process/next_tick.js, đặc biệt là các đường dẫn xử lý stack được tham chiếu. Công việc được xem là hoàn tất khi regression đã được kiểm thử và error handler của cùng domain không còn bị gọi lặp lại khi nó ném ra một exception.
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, nodejs
- Lĩnh vực
- backend, testing
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100