Ruby 1.8.7-pXX v.s. Capistrano 2.5.x
最近のRubyでCapistranoを実行しようとすると、対象ホストが二つ以上のときにかなりの確率でハングアップしてしまうことに気付いた。しばらくは見て見ぬふりをしていたのだが、仕事に少し関係しそうな気配もあって、調べてみることにした。
1.8.7-p72では問題なかった記憶があり、1.8.7-p174で現象が出ることは確認済み。ということでtagのある1.8.7-p72、1.8.7-p160をかわきりに、ruby_1_8_7におけるversion.hのcommit logを手掛かりに二分探索の雰囲気を出しつつ絞り込みをかけていったところ1.8.7-p135で現象が現れることがわかった。
このパッチレベルでの修正内容はruby-core:20446である。が、これを見ても具体的にどういう影響が出ているのかはわからない。修正内容からするとむしろ状況がよくなってくれそうなものだが…… などと思いつつ、試行錯誤を繰り返した。
まず、Capistranoでの問題はNet::SSHで起こっていることがわかった。Net::SSHではIO.selectを使っいながらソケットから少しずつ読み出すということをしている。これにThreadを組み合わせると現象を起こせる。たとえばこんな感じ:
require "net/ssh"
["localhost","localhost"].map {|h|
Thread.new{ Net::SSH.start(h, "foo") }
}.each {|t| t.join }
次に、修正内容と見比べつつさらに試行錯誤し、結局はdebug printをいれてスレッドの動きを追いかけた。かなりおおざっぱな読み方しかしていないので間違っているかもしれないが、なんとなくこんな感じの動きのようだった:
- 読み出し可能になるのを待っているスレッドがある
- そのスレッドで読み出し可能になる→th_foundに値が入る
- 次にスケジューリングのためスレッドを順番に見ていくが
- 運悪く、th_foundなスレッドに到達する前に「次」に実行可能なスレッドが見付かってしまう
現象からいうと運悪くというよりは運良く処理が進むことがあるといったところで、ほとんどの場合、上の再現例の二つのスレッドがゆずり合うような形になっている。
そこで、試みにth_foundしたスレッドにできるだけ処理がまわるよう、スレッドのプライオリティが同じときにも「次」候補のチェックをするように以下のような変更を加えてみた。
--- eval.c (revision 24335)
+++ eval.c (working copy)
@@ -11228,7 +11228,7 @@
break;
}
if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) {
- if (!next || next->priority < th->priority) {
+ if (!next || next->priority <= th->priority) {
if (th == th_found) {
th_found->status = THREAD_RUNNABLE;
th_found->wait_for = 0;
Capistranoでの動きをざっとみたところではこの変更で止まらずに動くようになった。Rubyのテスト(threadのみ)をまわしてみた限りでは影響はなさそう。はてさて。
……という話をIRCでしてみたところmputさんがredmineに登録してくれた(Bug#1848、ruby-dev:38971)。あと多分、これは同じ話だと思う。
追記(2009-08-07)
少なくとも上の変更ではまずいと思えるので変更を出しなおしたのがruby-dev:39003。ただ、それでもまずい感じはするよねと思っていたところ、やはり好しくないらしい。
それではということで再現コードを小さくして、debug printで動きを追いかけてみたのがruby-dev:39037になる。th_foundとはちょうどあべこべにスレッドが選択されている…… ような気がしている。
追記(2009-08-10)
ruby-dev:39042にある通りr24442で修正された。
空の下屋根の中(1)
おすすめ:
空の下屋根の中(1)[rakuten]
ASH&D LIVE EXTRA「灰とダイヤモンド」
ASH&D LIVE EXTRA「灰とダイヤモンド」を観てきた。築地、ブディストホールにて。
この間からアレコレあって、落ち込みぎみというか、自己嫌悪ぎみというか、まあ、なんだかそんな状態だったので間が悪かったなとか、行くの止めようかとか、思ったんだけども、むしろこのタイミングだったのはよかったかもなと考えることにした。
いやー、行ってきてよかったよ、気分を変えられたよ、となるといいなと思っていたのだけど、残念ながらそこまではいかなかった。ライブ全体としては低調。観る側の気持ちのせいもあるけど、もう一つ飲み込むのにがんばりが必要なネタが多かった。あり体にいえば好みではない。
でも一番の目当てだったザ・ギースのネタは面白かった。二本目のネタが特に。一本目は舞台がちょっと狭めでしたかね。目当ての二番めは夙川アトムさん。しゃっくりネタはテレビで一度だけ観たことがあったがストーリーは違っていた。業界人紙芝居もなんだかんだ好きなんだけど、今日の二本ともそれとは違った感じ。こういうのがやりたいのかな。はじめ面くらったけどじわじわきた。二組とも単独でボリューム感のあるのを観てみたい。
新人さんラブレターズと斎藤さん。ラブレターズのほうはネタがまだ(?)ちょっと粗いのかなと思ったけどわりと面白かった。斎藤さんはちょっとパントマイムっぽいところがうもれてしまっていたような。好みとも違っていてピンとこなかった。
散髪とか散歩とか
今日は前々から予約していた散髪の日。元町にあるnestに着いたのは時間ぎりぎりだった。まだ大丈夫とのんびりしていたせいで。
予報では天気が悪そうだったので歩いていくつもりでいたのだが、間に合わない+天気がもちそうな感じ=自転車投入としてなおぎりぎり。急いだためにただでさえ暑いところにさらに上乗せで、汗がふき出るような状態に気がひけるもののどうしようもなく……。
少しずつアジャストしていく感じに気候の具合いを加味して「これこれなので今回はココをこうしてみては」という感じの提案がある。いつもそれに乗っかる。つまりはおまかせなんだけど、うまくおさまるようにしてくれるた上で、前回少しずつ変化がある(自分ではあまりわからないのだけど、帰宅するとそう言われる)。次回の予約をして移動。
自転車があり、少し時間がありそうだったので元町通りを石川町駅→元町中華街駅へとぶらぶらと抜けていき、そのまま山下公園に入る。なんだかトンボが多い。港のほうに近付いてみると大桟橋の人出があるのが見える。何かあったのかなと近付くと見なれぬタイプの船がいくつか。中を見られるのかな?
その後、関内にまわり、ベジタブルマーケットで昼食。ランチメニューに今回はデザートを付けた。いつもながらはずれがなくておいしい。
かなりゆっくりしてから、横浜公園にちょっと戻って改修された庭のあたりぶらぶら。なじみの顔を見付けて安心したところで関内のパン屋さんに行くためにまた戻る。その途中でローロ馬車道店に寄って、どうにもブレーキがキーキーいうんです、というので自転車をみてもらった。シューはまだ交換時期ではないから何かの相性かもしれないとのこと。車輪をみがいてもらって、多分、少し調整してもらって、サスの空気を入れてもらって、でも、まだ少し音が残っていて完全ではないからお代は結構です、と。少し乗ってみて気になるようだったらシューを換えてみましょうということで、ありがたいなかにちょっと申しわけない気持ちも入ってお店を後にした。
それにしてもストライダとかKHSとかBD-1の新しいのとか、見てると欲しくなる。ちょうどやってきた別のお客さんが乗っていたのが新しいBD-1で、慣れた感じでかつきれいな車体にちょっとあこがれる。あとCARRY MEという自転車。これはかなり欲しくなった。実際に乗るとどんな感じなんだろう。
こんなの(BD-1とか製造している会社らしい?) → Pacific Cycles Carry-me
amazon.co.jp
自転車JOY(楽天)
完全ではないといわれながらもずいぶんと調子のよくなった自転車に乗って、今度は黄金町駅近くのマイノリティーズコーヒーに向かう(途中で忘れずにパンを買った)。小さなお店で禁煙ではないため、入れないかもね、なんて話しながら。着いてみればお店の前にテーブルが出してある。煙もないしこれはいいねと外でコーヒー。川があって日陰で、風が通って、ホットコーヒーがちょうどよい。赤い電車をながめながらおいしいコーヒーでゆっくり過ごした。
海のエジプト展
パシフィコで開催中の海のエジプト展に行ってきた。
音声ガイドを二人で交替で聞きながら、場内各所で流されている映像(3分程度のものがいくつも)を見ながら、まわりの人とそれほど違わないテンポでまわったところ、およそ二時間半というところ。ただし、閉場まぎわだったためバーチャルリアリティのなんとかっていうのは観られなかった)。三時間くらいはみておいたほうがよいのかも。
ちょっと残念だったのは発掘の事前調査の映像が出ても、それは何をやっているのかとか、どう読み取ればいいのかとか、そういうかんじんなところにまったく触れていない点(かなりショーっぽい)。それと小物の展示は高さとか置き方とかの関係でちょっと見にいと感じることがあった。説明書きが展示物の薄暗い向こう側に離れているとか。
ま、そんなこともありつつも。あまり知識がないので「でかー」とか「よく残ってたな」とか「ヒエログリフがちょっといい感じ」とか、ほとんどそんな感想ばかりになってしまったが、なかなか面白かった。例によって写真がダメというのがとても残念。







