Bug #10193
closedTestIO#test_readpartial_locktmp fails randomly
Description
4) Error:
TestIO#test_readpartial_locktmp:
IOError: stream closed
/builddir/build/BUILD/ruby-2.2.0-r47288/test/ruby/test_io.rb:2861:in `readpartial'
/builddir/build/BUILD/ruby-2.2.0-r47288/test/ruby/test_io.rb:2861:in `block (2 levels) in test_readpartial_locktmp'
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r47353.
test_io.rb: ignore stream closed IOError
- test/ruby/test_io.rb (test_readpartial_locktmp): stream closed
IOError while reading is not a matter. [Bug #10193]
Updated by normalperson (Eric Wong) over 10 years ago
nobu@ruby-lang.org wrote:
Applied in changeset r47353.
test_io.rb: ignore stream closed IOError
- test/ruby/test_io.rb (test_readpartial_locktmp): stream closed
IOError while reading is not a matter. [Bug #10193]
I get EBADF now:
TestIO#test_readpartial_locktmp:
Errno::EBADF: Bad file descriptor
/home/ew/ruby/test/ruby/test_io.rb:2870:in readpartial' /home/ew/ruby/test/ruby/test_io.rb:2870:in
block (2 levels) in test_readpartial_locktmp'
Testing the following:
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -2874,6 +2874,7 @@ End
assert_predicate(th, :alive?)
w.write(data)
Thread.pass while th.alive?
-
endth.join
assert_equal(data, buf, bug6099)
rescue RuntimeError # can't modify string; temporarily locked
I'm not sure if setting th->waiting_fd for rb_wait_for_single_fd
is a good idea. I think any poll/select wrappers should reload fileno
from IO objects on EBADF, because th->waiting_fd does not scale.
Updated by normalperson (Eric Wong) over 10 years ago
Eric Wong normalperson@yhbt.net wrote:
Testing the following:
Sorry, bad patch. The big rescue/ensure clauses was hiding bugs.
The problem is th.stop? happens twice:
1) release GVL for read() => EAGAIN
2) release GVL for rb_io_wait_readable()
We only accounted for one case in the previous code (and it is
unpredictable which).
I'm confident about the following patch:
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -2866,24 +2866,29 @@ End
data = "a" * 100
th = nil
with_pipe do |r,w|
-
r.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
-
th = Thread.new {r.readpartial(100, buf)}
-
Thread.pass until th.stop?
-
buf.replace("")
-
assert_empty(buf, bug6099)
-
assert_predicate(th, :alive?)
-
w.write(data)
-
Thread.pass while th.alive?
- end
- assert_equal(data, buf, bug6099)
- rescue RuntimeError # can't modify string; temporarily locked
- ensure
- if th
begin
-
r.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
-
th = Thread.new {r.readpartial(100, buf)}
-
Thread.pass until th.stop?
-
assert_equal 100, buf.bytesize
-
begin
-
buf.replace("")
-
rescue RuntimeError => e
-
assert_match(/can't modify string; temporarily locked/, e.message)
-
Thread.pass
-
end until buf.empty?
-
assert_empty(buf, bug6099)
-
assert_predicate(th, :alive?)
-
w.write(data)
-
Thread.pass while th.alive? th.join
-
endrescue IOError end
- assert_equal(data, buf, bug6099)
end
def test_advise_pipe