Reduce chance to receive EBADF when closing an IO from another thread. #4717
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I guess we have some bugs in
io.c
.This is my log output. It comes from here:
So, after
rb_read_internal
is done,fptr->fd is -1
. It seems race condition onfptr->fd
.rb_read_internal
can release GVL, and another thread can call#close
, which causefd = -1
.Sometimes Ruby can call
read(-1)
which returnsc = -1
- even 2.x branch probably.Here is my test case:
There seem to be lots of cases where we use
fptr->fd
without any check. But we are just concerned with#read
in the above test.The PR does two things:
rb_io_check_closed
tofptr_wait_readable
and friends which ensures consistent behaviour with previous releases.read(fd)
to ensure thatfd != -1
. I believe maybe we need to do this in more places.