Project

General

Profile

Actions

Bug #10193

closed

TestIO#test_readpartial_locktmp fails randomly

Added by vo.x (Vit Ondruch) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.0dev (2014-08-26 trunk 47288) [x86_64-linux]
[ruby-core:64710]

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 9 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 9 years ago

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?

  •  th.join
    
    end
    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 9 years ago

Eric Wong 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
    
  •  rescue IOError
     end
    
    end
  • assert_equal(data, buf, bug6099)
    end
def test_advise_pipe
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0