Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mknmz aborted while processing RFC text files (namazu-bugs-ja#41)



<7m66m9mbpn.wl@xxxxxxxxxxxxxxxxxxxxxx>の記事において
kuriyama@xxxxxxxxxxxxさんは書きました。

>>  あ、NMZ.i の方のデータが壊れている可能性を考えていませんでした。
>> index の最中になんらかの理由で処理が中断してしまったとすると、変なデータ
>> になってしまうことがあるかも知れませんね。

  NMZ.i 及び NMZ.i.tmp について、次のようなテストプログラムを用いてデー
タの整合性(という程のものでもないですが...)を調べてみました。

-- 
#!/usr/bin/perl

use FileHandle;

my $fh_i = FileHandle::new;
$fh_i->open("< NMZ.i");

while (!$fh_i->eof()) {
    my $baseleng = readw($fh_i);
    print "baseleng = $baseleng\n";
    my $baserecord = "";
    read($fh_i, $baserecord, $baseleng);
}

# readw: read one pack 'w' word.
# This code was contributed by <furukawa@xxxxxxxxxxxx>.
sub readw ($) {
    my $fh = shift;
    my $ret = '';
    my $c;
    
    while (read($fh, $c, 1)){
        $ret .= $c;
        last unless 0x80 & ord $c;
    }
    return unpack('w', $ret);
}
-- 

  単純に baseleng をひたすら読むだけのプログラムです。データに問題があ
れば同様のエラーが出るはずなのですが... NMZ.i, NMZ.i.tmp 共に問題はあ
りませんでした。

  こうなると、問題はもっと別のところにあるのかなぁ、という気がしてきま
す。この問題の出る近辺の処理の流れは

* メモリ内に保持されている、新規に処理されたデータと、 NMZ.i, NMZ.ii
  の内容をまとめて NMZ.i.tmp, NMZ.ii.tmp に出力
* NMZ.i.tmp, NMZ.ii.tmp を NMZ.i, NMZ.ii に rename

  となっています。以前 close を明示していないことによる問題が発生した
ことがありましたが、ひょっとするとこれも同様の問題がおきているのかも...
と(根拠はないですが)疑っています。

  あとで close を明示した version を作ってみますので、それで一度試して
みていただけませんでしょうか。

# こういう時は branch を切った方がいいのかな。
-- 
野首 貴嗣
E-mail: knok@xxxxxxxxxxxxx