From: Tanaka Akira Date: 2012-06-06T08:00:57+09:00 Subject: [ruby-dev:45703] test_advise failure on GNU/Linux 今朝、気がついたのですが、手元で test_advise が失敗します。 % ./ruby test/runner.rb test/ruby/test_io.rb -n test_advise Run options: -n test_advise # Running tests: [1/1] TestIO#test_advise = 0.02 s 1) Error: test_advise(TestIO): Errno::EINVAL: Invalid argument - /tmp/test_io20120606-9014-1n5vh7p /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1971:in `advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1971:in `block (3 levels) in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1970:in `open' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1970:in `block (2 levels) in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1969:in `each' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1969:in `block in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1968:in `each' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1968:in `test_advise' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:1075:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit/testcase.rb:17:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:840:in `block in _run_suite' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:832:in `map' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:832:in `_run_suite' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:649:in `block in _run_suites' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:647:in `each' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:647:in `_run_suites' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:792:in `_run_anything' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:981:in `run_tests' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:968:in `block in _run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:967:in `each' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:967:in `_run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:956:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:21:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:751:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:804:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:808:in `run' test/runner.rb:15:in `
' Finished tests in 0.026001s, 38.4597 tests/s, 2115.2831 assertions/s. 1 tests, 55 assertions, 0 failures, 1 errors, 0 skips ruby -v: ruby 2.0.0dev (2012-06-06 trunk 35933) [x86_64-linux] % uname -a Linux cirrus 3.2.0-2-amd64 #1 SMP Mon May 21 17:45:41 UTC 2012 x86_64 GNU/Linux % lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux testing (wheezy) Release: testing Codename: wheezy 最近そのあたりは変わってないような、と思って strace してみると、 fadvise64 が EINVAL のようです。 % strace -e fadvise64 ./ruby test/runner.rb test/ruby/test_io.rb -n test_advise Run options: -n test_advise # Running tests: [1/1] TestIO#test_advisefadvise64(5, 0, 0, POSIX_FADV_NORMAL) = 0 fadvise64(5, 0, 20, POSIX_FADV_NORMAL) = 0 fadvise64(5, 400, 2, POSIX_FADV_NORMAL) = 0 fadvise64(5, 0, 0, POSIX_FADV_RANDOM) = 0 fadvise64(5, 0, 20, POSIX_FADV_RANDOM) = 0 fadvise64(5, 400, 2, POSIX_FADV_RANDOM) = 0 fadvise64(5, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 fadvise64(5, 0, 20, POSIX_FADV_SEQUENTIAL) = 0 fadvise64(5, 400, 2, POSIX_FADV_SEQUENTIAL) = 0 fadvise64(5, 0, 0, POSIX_FADV_WILLNEED) = -1 EINVAL (Invalid argument) = 0.02 s 1) Error: test_advise(TestIO): Errno::EINVAL: Invalid argument - /tmp/test_io20120606-9033-121z14z /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1971:in `advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1971:in `block (3 levels) in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1970:in `open' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1970:in `block (2 levels) in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1969:in `each' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1969:in `block in test_advise' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1968:in `each' /home/ruby/tcstate/ruby/test/ruby/test_io.rb:1968:in `test_advise' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:1075:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit/testcase.rb:17:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:840:in `block in _run_suite' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:832:in `map' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:832:in `_run_suite' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:649:in `block in _run_suites' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:647:in `each' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:647:in `_run_suites' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:792:in `_run_anything' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:981:in `run_tests' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:968:in `block in _run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:967:in `each' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:967:in `_run' /home/ruby/tcstate/lib/ruby/2.0.0/minitest/unit.rb:956:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:21:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:751:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:804:in `run' /home/ruby/tcstate/lib/ruby/2.0.0/test/unit.rb:808:in `run' test/runner.rb:15:in `
' Finished tests in 0.032192s, 31.0636 tests/s, 1708.4977 assertions/s. 1 tests, 55 assertions, 0 failures, 1 errors, 0 skips ruby -v: ruby 2.0.0dev (2012-06-06 trunk 35933) [x86_64-linux] SUSv4 の posix_fadvice の EINVAL のところには advice がおかしいか、 len が負のとき、とあるのですが、 fadvise64(5, 0, 0, POSIX_FADV_WILLNEED) というのは どちらの条件も外れているように思えます。 ふと思いついて、/tmp じゃなくてカレントディレクトリにテンポラリディレクトリを作ると、うまくいきます。 % mkdir zd % TMPDIR=zd ./ruby test/runner.rb test/ruby/test_io.rb -n test_advise Run options: -n test_advise # Running tests: Finished tests in 0.049990s, 20.0039 tests/s, 2180.4283 assertions/s. 1 tests, 109 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0dev (2012-06-06 trunk 35933) [x86_64-linux] % df /tmp . ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 tmpfs 788348 1296 787052 1% /tmp /dev/disk/by-uuid/deba395d-7518-4814-a884-313e25a47d54 300088912 57330904 227514388 21% / /tmp は tmpfs で、カレントディレクトリは ext3 なのですが、 それが関係あるのかもしれません。 原因がどこにあるにせよ、TMPDIR を設定しなくてもうまくいくといいなぁ、 と思うのですが、なにかよい方法はあるでしょうか。 -- [田中 哲][たなか あきら][Tanaka Akira]