Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 36.4k
test: http2 rstStream duplicate call#16217
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
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -15,12 +15,15 @@ server.on('listening', common.mustCall(() => { | ||||||||||||||||||||||
| const client = h2.connect(`http://localhost:${server.address().port}`); | ||||||||||||||||||||||
| const req = client.request({ ':path': '/' }); | ||||||||||||||||||||||
| // make sure that destroy is called twice | ||||||||||||||||||||||
| req._destroy = common.mustCall(req._destroy.bind(req), 2); | ||||||||||||||||||||||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am a bit lost in how this is possible, in theory it is protected from running
| ||||||||||||||||||||||
| stream.destroy(); |
node/lib/internal/http2/core.js
Line 931 in ff747e3
| stream.destroy(); |
This might translate to two calls of req._destroy?
I've run the test on repeat 100 times to confirm that it it succeeds using the following command:
> python tools/test.py -J --mode=release parallel/test-http2-client-rststream-before-connect --repeat 100
[00:06|% 100|+ 100|- 0]: Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe @mcollina is right. I think what's happening is that this line is accounting for the 2 triggers of _destroy:
node/lib/internal/http2/core.js
Lines 1494 to 1498 in ff747e3
| if(this[kID]===undefined){ | |
| debug(`[${sessionName(session[kType])}] queuing destroy for new stream`); | |
| this.once('ready',this._destroy.bind(this,err,callback)); | |
| return; | |
| } |
The reason that it's different than before is because the declaration was moved before client.rstStream() instead of after. I think that stream.destroy() isn't even necessary and it should just be the empty return;.
ping @jasnell — any thoughts re: whether that stream.destroy() serves an actual purpose?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've run the test on repeat 100 times
@trivikr the test might be passing, but I'm wondering if the actual behavior is correct.
I don't think that calling rstStream() twice should destroy the stream. It seems a not needed side effect. I think it should throw.
node/lib/internal/http2/core.js
Lines 929 to 931 in ff747e3
| // rst has already been called, do not call again, | |
| // skip straight to destroy | |
| stream.destroy(); |
cc @jasnell
trivikrOct 18, 2017 •
edited
Loading Uh oh!
There was an error while loading. Please reload this page.
edited
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll dig in on this a bit more later on today
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice catch!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! :-)