[#45085] [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC — Narihiro Nakamura <authorNari@...>

11 messages 2012/01/04

[ruby-dev:45104] [ruby-trunk - Bug #5850] Failure test/ruby/test_io.rb

From: Tomoyuki Chikanaga <nagachika00@...>
Date: 2012-01-06 17:19:14 UTC
List: ruby-dev #45104
Issue #5850 has been updated by Tomoyuki Chikanaga.


ええと、まず GC で確実に回収される保障がない以上 test_autoclose の後半の assertion は失敗する可能性があります。try_fdopen でメソッド呼び出しを100回ネストして IO.for_fd した後 GC でその IO オブジェクトを回収させようとしているようですが、ruby で書かれたメソッドの呼び出しをネストしてもマシンスタックは積まれないためマシンスタック上からの誤った参照の影響をなくす効果は薄いと思います。ためしに try_fdopen に 1.times do ... end のようにブロック呼び出しするメソッド(マシンスタック消費する)を入れてみると Snow Leopard では Failure がおきなくなりました。ただこれ以外のところにたまたま偽の参照があったらやはり回収されないので失敗する可能性は残ります。

また test_copy_stream の Error ですが、これは先の test_autoclose で 2つの IO オブジェクトが同じ fd について open されている状態になっていて、一方(Tempfile のほう)は明示的に close されていますがもう一方は close されないまま放置されているため、その IO が GC されたタイミングで close(2) が呼ばれます。その時にその fd が別の IO オブジェクトのために再利用されたものを閉じてしまうためではないかと思います。 これは [Feature #2250] で言われている IO.for_fd の危険な使いかたそのものです。

 - test_autoclose の後半の assertion は IO オブジェクトに finalizer を設定して回収されたかどうかをチェックして、回収されなかったらあきらめる
 - autoclose: true の時のテストは子プロセスに分離する

というのでどうでしょうか。問題or代案がなければこの方針でテストを修正するパッチを書こうと思います。
----------------------------------------
Bug #5850: Failure test/ruby/test_io.rb
https://bugs.ruby-lang.org/issues/5850

Author: Ayumu AIZAWA
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0] 


=begin
r34219で test/ruby/test_io.rb が1件失敗、1件エラーになります。
エラーの方は-j で実行すると最初は失敗してそのあと成功します。

 0:ruby ➔  make test-all TESTS=test/ruby/test_io.rb
 ./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./test/runner.rb" --ruby="./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" test/ruby/test_io.rb
 Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"
 
 # Running tests:
 
 .F.............E..................................................................................................
 
 Finished tests in 4.242426s, 26.8714 tests/s, 134.3571 assertions/s.
 
 1) Failure:
 test_autoclose(TestIO) [/Users/ayumin/github/ruby/test/ruby/test_io.rb:1444]:
 Errno::EBADF expected but nothing was raised.
 
 2) Error:
 test_copy_stream(TestIO):
 Errno::EBADF: Bad file descriptor
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:32:in `close'
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:32:in `rescue in block in pipe'
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:29:in `block in pipe'
 
 114 tests, 570 assertions, 1 failures, 1 errors, 0 skips
 
 ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0]
 make: *** [yes-test-all] Error 2
 0:ruby ➔  make test-all TESTS='-j 2 test/ruby/test_io.rb'
 ./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./test/runner.rb" --ruby="./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" -j 2 test/ruby/test_io.rb
 Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" -j 2
 
 # Running tests:
 
 .F.............E..................................................................................................
 Retrying...
 
 .F................................................................................................................
 
 
 
 Finished tests in 10.072929s, 11.3175 tests/s, 56.5873 assertions/s.
 
 1) Failure:
 test_autoclose(TestIO) [/Users/ayumin/github/ruby/test/ruby/test_io.rb:1444]:
 Errno::EBADF expected but nothing was raised.
 
 114 tests, 570 assertions, 1 failures, 0 errors, 0 skips
 
 ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0]
 make: *** [yes-test-all] Error 1
 
=end



-- 
http://redmine.ruby-lang.org

In This Thread