読者です 読者をやめる 読者になる 読者になる

あいつの日誌β

あいつの日誌です。

すごく不正確な独り言

会社でgroongaを実行するとDBの作成はできるんだけどサーバーモードで起動しない(or起動直後終了?)してしまいました。
で、問題は解決してないのですがメモ。後日修正される、はず。

読んでもいいけど信じちゃだめ!!
今風邪でくらくらしながらコレ書いてるからメモ内容が間違えてる可能性も高い(なぜ公開している)

現象

会社

MacOSX10.7 
groonga --version groonga 1.2.6 [darwin11.1.0,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,zlib,kqueue]

自宅

MacOSX10.6
% groonga --version                                                [~/project/Youtube-Movie]
groonga 1.2.4 [darwin10.7.0,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,zlib,kqueue]

症状

会社で以下のコマンドは動作します。

% groonga -n test.db

ですが次のようなコマンドは動かない?

% groonga -s --port 10041 --protocol http test.db
%

犯人誰?

実はTest::TCPというgroongaサーバーを一時的に起動してテストが終了したらgroonga -s を実行しているpidをkillするプログラムを使っているのですがこれがこけていたので異変に気づきました。
ちなみにTest::TCPをgit cloneして、prove -lvr t を実行したところ問題はありませんでした。Test::TCPのversionは1.14で最新

で、よくよくコードを追いかけたらgroongaも確かに思ったように動かないのですが、そもそもTest::TCP::empty_portがdieしている(portが空いていない場合はそれが想定の処理)。
_check_port内の以下の処理が成功していないらしい

    my $remote = IO::Socket::INET->new(
        Proto    => 'tcp',
        PeerAddr => '127.0.0.1',
        PeerPort => $port,
    );

ためしに以下のコードを会社で実行するとdieしてしまう

use strings;
use warnings;
use IO::Socket::INET;
my $remote = IO::Socket::INET->new(
    Proto    => 'tcp',
    PeerAddr => '127.0.0.1',
    PeerPort => $port,
) or die;

で、次のコードはdieしない。

use strings;
use warnings;
use IO::Socket::INET;
my $remote = IO::Socket::INET->new(
    Proto    => 'tcp',
    LocalAddr => '127.0.0.1',
    LocalPort => $port,
) or die;

ただし、この結果が何を意味しているのかわからない。
たぶん見当違いだろうけど何かのヒントになるかもしれないので自分が忘れないようにメモ

俺の推理

  • とりあえず上記の処理はTest::TCPでgroongaを実行する前で起きてる問題なので、おそらくgroongaの問題ではない
  • Test::TCPもたぶん悪くない。test全部通っている。
localhostの概念があやしい

自宅では自分しかネットワークに属していないのに対して会社のマックは社内のネットワークに属している。なんかちがうのかも。
そういえば自宅のMacは一般ユーザーでnetstatが使える

% which netstat                                                          
/usr/sbin/netstat

でも会社のMacだとsudo netstatしないと使えなかった。これ関係あるのかなー。

あとは会社でも plackup -p 10041 できた..

とりあえず一番怪しいのは俺のネットワークに関する知識だな。

続く、かも。

追記

nslookup localhost で /etc/hosts を見ていなかったです...