Namazu-devel-ja(旧)


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

Re: negative integer bug



knok@xxxxxxxxxxxxx (NOKUBI Takatsugu) wrote:

>> Cannot compress negative numbers 
>> <http://www.namazu.org/ml/namazu-users-ja/msg00700.html>
>> は最近某所でも問題にされたので、今日はこの問題に取り組んでみようと思っ
>> ていました。
>
>  鵜飼さんの協力を得て原因らしきものが見えてきました。

僕はこのエラーを見たことがありません。


>  write_index_sub などの中で index の merge をする時に、追加分の最初の
>docid が既存のデータの最後の docid よりも小さい時に adjust_first_docid 
>で negative になってしまう、というのが原因のようです。

「追加分の最初のdocid が既存のデータの最後の docid よりも小
さい」という状況はあってはいけません。なぜそういうことが起き
るのだろう。再現する方法はありませんか? 少ない文書で再現でき
るといいのだけど。


>  そもそもそうなってしまうこと自体がおかしいのかどうかは良くわからなかっ
>たのですが、とりあえずここのロジックを変更して append_record という関
>数を新たに導入することで対処してみました。

肝心なロジックがわからずに解決できるのだろうか…。 

docid は差分で記録される:

  ===================================
		 |    インデックス
  ---------------+-------------------
  docidの絶対値  |  1  6  7 15 22 30 
  差分の docid   |  1  5  1  8  7  8 

インデックスを追加するとき:

  ==============================================
		 | 既存のインデックス | 追加分
  ---------------+--------------------+---------
  docidの絶対値  |  1  6  7 15 22 30  | 34 39 50
  差分の docid   |  1  5  1  8  7  8  | 34  5 11
                                        ^^

adjust_first_docid によって追加分の最初の docidを調整する:

  ==============================================
		 | 既存のインデックス | 追加分
  ---------------+--------------------+---------
  docidの絶対値  |  1  6  7 15 22 30  | 34 39 50
  差分の docid   |  1  5  1  8  7  8  |  4  5 11
                                        ^^

この図からわかると思いますが、「追加分の最初のdocid が既存の
データの最後の docid よりも小さい」という状況はあってはいけ
ないのです。


>  make check すると一部 fail するのでまだ問題があるかもしれません。一
>応ソースの差分をつけておきますので、どなたか検証してみていただけません
>でしょうか。

見てみました。無用に複雑なことをしているように見えます。
negative integer の問題を解決するには「追加分の最初のdocid 
が既存のデータの最後の docid よりも小さい」という現象が起き
る条件を理解する必要があると思います。

# adjust_first_docid に無駄なコードが入っていたので削除して
# おきました。 ($val と $adjusted)

-- Satoru Takabayashi