Namazu-devel-ja(旧)


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

NMZ.status Bug?



竹迫です。

Namazu 2.0 for Win32 の mknmz においてバグと思われる
現象がありましたので、ご報告させていただきます。

● 環境
 Windows NT4.0 SP5 / Windows 95 OSR2.1
 Namazu 2.0.5-pre4 / Namazu 2.0.4 for Win32
 ActivePerl 5.00503 build 522 で確認

● 現象
 インデックスを複数回更新すると、Total Documents の数がうまく
カウントされない。(NMZ.status が正しく更新されていない)

● 再現方法

1. まず初めに 1つのファイルを検索対象に含め、インデックスを作成する
   → Total Documents: 1
2. 次に 5つのファイルを追加し、インデックスを更新する
   → Total Documents: 6
3. そして 1つのファイルを追加し、インデックスを更新する
   → Total Documents: 7 となるはずが、2 となってしまう

● 再現結果

このときの NMZ.head.ja の一部と NMZ.log NMZ.status ファイルの内容を
以下に記載いたします。

---- [NMZ.head.ja] 一部 ここから ----
現在、<!-- FILE --> 2 <!-- FILE --> の文書がインデックス化され、
<!-- KEY --> 2,917 <!-- KEY --> 個のキーワードが登録されています。
---- [NMZ.head.ja] 一部 ここまで ----

---- [NMZ.log] ここから ----
[Base]
Date:                Wed Oct  4 18:15:41 2000
Added Documents:     1
Size (bytes):        23,552
Total Documents:     1
Added Keywords:      259
Total Keywords:      259
Wakati:              module_kakasi -ieuc -oeuc -w
Time (sec):          44
File/Sec:            0.02
System:              MSWin32
Perl:                5.00503
Namazu:              2.0.5

[Append]
Date:                Wed Oct  4 18:17:20 2000
Added Documents:     5
Size (bytes):        88,035
Total Documents:     6
Added Keywords:      2,650
Total Keywords:      2,909
Wakati:              module_kakasi -ieuc -oeuc -w
Time (sec):          58
File/Sec:            0.09
System:              MSWin32
Perl:                5.00503
Namazu:              2.0.5

[Append]
Date:                Wed Oct  4 18:19:34 2000
Added Documents:     1
Size (bytes):        35,409
Total Documents:     2             ← ここが 7 となるはず...
Added Keywords:      2,658
Total Keywords:      2,917
Wakati:              module_kakasi -ieuc -oeuc -w
Time (sec):          45
File/Sec:            0.02
System:              MSWin32
Perl:                5.00503
Namazu:              2.0.5
---- [NMZ.log] ここまで ----

---- [NMZ.status] ここから ----
files 1
keys 259
argv -O E:\namazu\index E:\namazu\test
cwd E:/namazu
files 6
keys 2909
argv -O E:\namazu\index E:\namazu\test
cwd E:/namazu
files 2
keys 2917
argv -O E:\namazu\index E:\namazu\test
cwd E:/namazu
---- [NMZ.status] ここまで ----
↑このファイルおかしいですよね...

● 原因
  put_status() で新たに files キーの値を更新するときに、
unlink $var::NMZ{'status'} が失敗し、古い値の書き込まれた
NMZ.status が削除されずに追記されてしまう。
get_status("files") では、一番上にある files の行の値を
読み取ってしまうため、Total Documents: の値を正しく計算
できなくなる。

● 対処方法
 mknmz の get_status() において使用されているファイルハンドル $fh を
明示的に開放 (close) するようにする。添付のパッチファイル参照
→ mknmz-status-patch.txt

同様のことを Linux や IRIX の環境で試してみましたが、このような問題は
発生しなかったので、Windows 版 ActivePerl 特有の問題だと思われます。
手元に環境がないため ActivePerl 5.6 では試していません。
他に Namazu 2.0 for Win32 を使っておられる方で、
同様な現象が確認できた方はいらっしゃいますでしょうか?

# もしかしたら、私の環境だけなのかな...(^^;
# 何回もインデックスを更新していくうちに Total Documents: の値が
# おかしくなってしまうので、結構悩んでしまいました。

--
   広島市立大学 情報科学部 情報機械システム工学科
     竹迫 良範 <takesako@xxxxxxxxx>
--- mknmz.org	Wed Oct 04 17:52:23 2000
+++ mknmz	Wed Oct 04 19:01:11 2000
@@ -1848,18 +1848,19 @@
 sub get_status($) {
     my ($key) = @_;
 
     my $fh = util::fopen($var::NMZ{'status'});
     return undef unless defined $fh;
 
     while (defined(my $line = <$fh>)) {
 	if ($line =~ /^$key\s+(.*)$/) {
 	    util::dprint("status: $key = $1\n");
+	    $fh->close;
 	    return $1;
 	}
     }
     return undef;
 }
 
 sub put_total_files($) {
     my ($number) = @_;
     $number =~ tr/,//d;