[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20251] Re: dyna_vars problem?

From: Tanaka Akira <akr@...17n.org>
Date: 2003-05-20 10:29:26 UTC
List: ruby-dev #20251
In article <1053424909.383731.24667.nullmailer@picachu.netlab.jp>,
  matz@ruby-lang.org (Yukihiro Matsumoto) writes:

> そうです。それでちょっと分かってきました。スレッドデバッグの
> とも、printfデバッグを駆使することによって原因が分かってきま
> した。
>
>   * thread_save_contextが行われる
>   * thread_restore_contextが行われる
>   * もう一度thread_restore_contextが行われる
>
> という状況が発生していて、最初のrestoreによる実行で、
> dyna_varsが解放されてしまうと、ダメということのようです。
>
> しかし、continuation以外で一つのsaveに複数のrestoreが対応す
> ることはないように作ったつもりだったんですが。

よくわかってませんが、例の gc を入れたところで finalizer が動いて、
finalizer の中でさらに thread が context switch するあたりではなかろう
かと疑っています。

> とりあえずCVS最新ではforce_recycleを禁止してみましたので、こ
> れで様子を見てくださいませ。

rb_gc() も入っているのはデバッグには都合がよくて便利です。が、意図せざ
るものではないかと思います。

実行してみたところ、(運が良かった時に)終了したような時間が経っても終ら
ないので、まだ(まだ)なにか変なところがあるんじゃないかという気がします。

% time ruby -d o
[#<Thread:0x401cca9c run>, 0, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1042004759/l50"}]
[#<Thread:0x4020340c run>, 1, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1004873294/l50"}]
[#<Thread:0x401cca9c run>, 2, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1020682294/l50"}]
[#<Thread:0x4020340c run>, 3, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1013846140/l50"}]
[#<Thread:0x401cca9c run>, 4, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1012445015/l50"}]
[#<Thread:0x4020340c run>, 5, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1037527388/l50"}]
[#<Thread:0x4020340c run>, 6, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1001950590/l50"}]
removing /tmp/open-uri3194.3...done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
[#<Thread:0x401cca9c run>, 7, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1048030962/l50"}]
Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
/home/akr/ruby/lib/ruby/1.8/timeout.rb:37:in `pop': execution expired (TimeoutError)
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `each_resource'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `timeout'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `each_resource'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:455:in `resolv'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:792:in `each'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:792:in `resolv'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:791:in `each'
        from /home/akr/ruby/lib/ruby/1.8/resolv.rb:791:in `resolv'
         ... 29 levels...
        from o:14:in `times'
        from o:14:in `concurrent_map'
        from o:74:in `main'
        from o:87
Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired
removing /tmp/open-uri3194.0...done
Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired

* なぜいきなり done がたくさん出て来るのか、 
* なぜ -d をつけていて、例外が起きているようなのにも関わらずプロセスが
  終了しないのか、

など、おもわず眉をひそめてしまう要素が満載です。
(それが Ruby のバグとは限りませんが。)
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread