Skip to content
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

stream: always reset awaitDrain when emitting data #18516

Merged
merged 2 commits into from
Feb 6, 2018

Conversation

addaleax
Copy link
Member

@addaleax addaleax commented Feb 2, 2018

The complicated awaitDrain machinery can be made a bit
slimmer, and more correct, by just resetting the value
each time stream.emit('data') is called.

By resetting the value before emitting the data chunk, and
seeing whether any pipe destinations return .write() === false,
we always end up in a consistent state and don’t need to worry
about odd situations (like dest.write(chunk) emitting more data).

Fixes: #18484
Fixes: #18512
Refs: #18515

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • commit message follows commit guidelines
Affected core subsystem(s)

streams /cc @nodejs/streams

@nodejs-github-bot nodejs-github-bot added the stream Issues and PRs related to the stream subsystem. label Feb 2, 2018
@addaleax addaleax mentioned this pull request Feb 2, 2018
4 tasks
@addaleax addaleax force-pushed the stream-pipe-simplify branch from 3c9d54f to 8a2f7e3 Compare February 2, 2018 00:59
Copy link
Member

@apapirovski apapirovski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🎉

@apapirovski
Copy link
Member

@mafintosh
Copy link
Member

@addaleax my gut feeling is that this will disable backpressure in some cases when doing multi destination pipes. let me investigate today. i agree we should clean up the awaitDrain stuff tho to fix that read while pipeing issue.

@mcollina
Copy link
Member

mcollina commented Feb 2, 2018

I would really love to get rid to state.awaitDrain and rewrite the full .pipe() mechanism using 'readable' and .read().

@mafintosh
Copy link
Member

@addaleax actually this looks really good. i'd still like to merge the other PR as well, to not emit data while paused in flowing mode.

@mafintosh
Copy link
Member

@addaleax
Copy link
Member Author

addaleax commented Feb 2, 2018

we can prob get rid of this as well with your PR https://github.com/addaleax/node/blob/8a2f7e327331cf1b50550292396136a9e25bc78f/lib/_stream_readable.js#L625-L632

@mafintosh This PR only refactors on the readable side of the pipe, so I’m not sure it should have any effect on that part … it looks like we didn’t have a test for the condition in that code though? :o I’ve added a test, I’d be glad if you could take a look at that too!

Copy link
Member

@mcollina mcollina left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@BridgeAR
Copy link
Member

BridgeAR commented Feb 6, 2018

This needs a rebase. Otherwise it could probably land right away.

@addaleax addaleax force-pushed the stream-pipe-simplify branch from 82b14c9 to 262601f Compare February 6, 2018 22:03
The complicated `awaitDrain` machinery can be made a bit
slimmer, and more correct, by just resetting the value
each time `stream.emit('data')` is called.

By resetting the value before emitting the data chunk, and
seeing whether any pipe destinations return `.write() === false`,
we always end up in a consistent state and don’t need to worry
about odd situations (like `dest.write(chunk)` emitting more data).

PR-URL: nodejs#18516
Fixes: nodejs#18484
Fixes: nodejs#18512
Refs: nodejs#18515
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
PR-URL: nodejs#18516
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
@addaleax addaleax force-pushed the stream-pipe-simplify branch from 262601f to ee67dd0 Compare February 6, 2018 22:14
@addaleax addaleax merged commit ee67dd0 into nodejs:master Feb 6, 2018
@addaleax
Copy link
Member Author

addaleax commented Feb 6, 2018

Landed in e7cb694, ee67dd0

@MylesBorins
Copy link
Contributor

Should this be backported to v9.x-staging? If yes please follow the guide and raise a backport PR, if not let me know or add the dont-land-on label.

addaleax added a commit that referenced this pull request Feb 27, 2018
PR-URL: #18516
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
addaleax added a commit to addaleax/node that referenced this pull request Feb 27, 2018
The complicated `awaitDrain` machinery can be made a bit
slimmer, and more correct, by just resetting the value
each time `stream.emit('data')` is called.

By resetting the value before emitting the data chunk, and
seeing whether any pipe destinations return `.write() === false`,
we always end up in a consistent state and don’t need to worry
about odd situations (like `dest.write(chunk)` emitting more data).

PR-URL: nodejs#18516
Fixes: nodejs#18484
Fixes: nodejs#18512
Refs: nodejs#18515
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
@addaleax addaleax mentioned this pull request Feb 27, 2018
MayaLekova pushed a commit to MayaLekova/node that referenced this pull request May 8, 2018
The complicated `awaitDrain` machinery can be made a bit
slimmer, and more correct, by just resetting the value
each time `stream.emit('data')` is called.

By resetting the value before emitting the data chunk, and
seeing whether any pipe destinations return `.write() === false`,
we always end up in a consistent state and don’t need to worry
about odd situations (like `dest.write(chunk)` emitting more data).

PR-URL: nodejs#18516
Fixes: nodejs#18484
Fixes: nodejs#18512
Refs: nodejs#18515
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
MayaLekova pushed a commit to MayaLekova/node that referenced this pull request May 8, 2018
PR-URL: nodejs#18516
Reviewed-By: Anatoli Papirovski <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Minwoo Jung <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stream Issues and PRs related to the stream subsystem.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants