doc: clarify effect of stream.destroy() on write()#25973
doc: clarify effect of stream.destroy() on write()#25973sam-github wants to merge 1 commit intonodejs:masterfrom
Conversation
c927a6b to
787ba1a
Compare
|
|
||
| Destroy the stream, and emit the passed `'error'` and a `'close'` event. | ||
| Destroy the stream. Optionally emit an `'error'` event, and always emit | ||
| a `'close'` event. |
There was a problem hiding this comment.
This chunk and the previous one are obvious doc clarifications, its the chunk after this that I'm not sure about.
| a `'close'` event. | ||
| After this call, the writable stream has ended and subsequent calls | ||
| to `write()` or `end()` will result in an `ERR_STREAM_DESTROYED` error. | ||
| This is a destructive and immediate way to destroy a stream. Previous calls to |
There was a problem hiding this comment.
The above sentence defines interaction with subsequent calls, but interaction with previous calls was undefined.
| After this call, the writable stream has ended and subsequent calls | ||
| to `write()` or `end()` will result in an `ERR_STREAM_DESTROYED` error. | ||
| This is a destructive and immediate way to destroy a stream. Previous calls to | ||
| `write()` may not have drained, and may trigger an `ERR_STREAM_DESTROYED` error. |
There was a problem hiding this comment.
I think #24062 should have prevented exactly this :(
There was a problem hiding this comment.
(i.e. if this does still happen, I’d say it’s a bug.)
There was a problem hiding this comment.
That's too bad, I hoped I could rewrite the tests.
There was a problem hiding this comment.
Should this be removed from the docs then? Its clearly possible, at least in one specific instance, but that doesn't mean people should code to expect it.
There was a problem hiding this comment.
@sam-github I am not eager to document it if it’s buggy, yes …
If you point me in the direction of steps to reproduce, I’ll definitely look into it
There was a problem hiding this comment.
@addaleax In the process of preparing a decent branch for you to look at I realized I was causing this problem myself, trying to cause data to flow in a way that fixed some things, but broke others. I'm still making progress, I think I just fixed the problem causing data not to flow with tls1.3 (the right way, this time), but if I run into another streams related wall, I'll take you up on this offer.
Wrt to this specific PR, I'll remove the reference to things that shouldn't happen.
There was a problem hiding this comment.
I'll remove the ref in a follow up PR.
| to `write()` or `end()` will result in an `ERR_STREAM_DESTROYED` error. | ||
| This is a destructive and immediate way to destroy a stream. Previous calls to | ||
| `write()` may not have drained, and may trigger an `ERR_STREAM_DESTROYED` error. | ||
| Use `end()` instead of destroy if data should flush before close, or wait for |
There was a problem hiding this comment.
destroy -> `destroy()` (with rewrapping, unfortunately).
| --> | ||
|
|
||
| * `error` {Error} | ||
| * `error` {Error} Optional, an error to emit with `'error'` event. |
There was a problem hiding this comment.
| * `error` {Error} Optional, an error to emit with `'error'` event. | |
| * `error` {Error} Optional, an error used as an argument for any callbacks | |
| listening to the `'error'` event. |
...or something like that? Nit-picky perhaps, but errors aren't emitted; events are. Anyway, optional nit, feel free to ignore.
There was a problem hiding this comment.
I thought I said that, and I don't want to reword the EventEmitter.emit() docs here. How about I reorder the words: "Optional, the 'error' event will be emitted with the error as an argument."?
There was a problem hiding this comment.
(Although "as an argument for any listeners" might be a hair better? Anyway, I'm OK with any of the possibilities here. Improvements/clarifications can always come at a later date.)
|
Landed in 69a8e34. |
|
@danbev I think that was too early, there were still outstanding comments requesting changes. Unfortunately, they weren't made with the Request Changes features, so without reading all the comments in detail its not obvious. I'll do a follow up PR to address the leftover comments. |
|
@sam-github Sorry about that and for causing the additional work. |
PR-URL: #25973 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
@mcollina or @addaleax or @nodejs/streams
I'd like some clarification on the expected interaction of
destroy()andwrite(). I am going through my final rounds of test cleanups on my TLS1.3 WIP, and the remaining failures are mostly about stream interactions, and I'm not sure if they are bugs or invalid tests. The docs aren't clear on the expected behaviour, so I propose some text in this PR, but I'm not sure if its correct - though it is what I observe.node/test/parallel/test-tls-destroy-stream.js
Lines 26 to 27 in a046ae5
I'm getting
ERR_STREAM_DESTROYEDfrom the above. I will do detailed analysis tomorrow, but I suspect it is because after thesecureConnectionevent, with TLS1.3, the SSL context is going to write some key update messages, so it slows down the flushing of CONTENT, and .destroy() causes the flushing to fail. Again, have to confirm that I understand what is happening, but either way, is the test valid? Note it passes if rewritten as:node/test/parallel/test-tls-invoke-queued.js
Lines 39 to 44 in a046ae5
In this case, the
destroy()doesn't error... but the'end'event on the client happens before ANY'data'events occur ...receivedis''atnode/test/parallel/test-tls-invoke-queued.js
Line 56 in a046ae5
Again, I have to do detailed analysis to see why the data was dropped, but this seems to me to be an invalid test case. Unlike
end()which is guaranteed to be serialized with any preceedingwrite()s, I don't thinkdestroy()has any such guarantee.Checklist
make -j4 test(UNIX), orvcbuild test(Windows) passes