[groonga-dev,03186] Re: mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生

Zurück zum Archiv-Index

Kouhei Sutou kou****@clear*****
2015年 4月 23日 (木) 11:55:08 JST


須藤です。

ありがとうございます!
エラーが発生しなくなったことを確認しました!

Mroongaでも問題が解決したことを確認したので、次回のリリース
では修正が含まれます。

酒匂さん、報告ありがとうございました!

In <CAAQQ****@mail*****>
  "[groonga-dev,03185] Re: mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生" on Wed, 22 Apr 2015 18:51:17 +0900,
  morit****@razil***** wrote:

> 遅くなりました!
> grn_pat_del()のバグを直してみたのですが、どうでしょうか。。
> 
> 2015-04-21 8:05 GMT+09:00 <morit****@razil*****>:
> 
>> 確認します!
>>
>> 2015-04-20 23:00 GMT+09:00 Kouhei Sutou <kou****@clear*****>:
>>
>>> 須藤です。
>>>
>>> 報告ありがとうございます。
>>>
>>> これは、Groongaのパトリシアトライの実装のバグっぽいですね。。。
>>>
>>> 森さん、masterにこのケースのテストを追加しておいたので確認し
>>> てもらえませんか?
>>>
>>> https://github.com/groonga/groonga/blob/master/test/command/suite/tables/patricia_trie/delete.expected
>>>
>>> ↓を実行すると_grn_pat_del()で
>>>
>>>   % test/command/run-test.sh
>>> test/command/suite/tables/patricia_trie/delete.test
>>>
>>> ↓というエラーがでるようになります。
>>>
>>>   no delinfo found 3
>>>
>>> これ、"3"というキーを_grn_pat_add()するときが問題な気がする
>>> んですよねぇ。
>>>
>>> 個人的には↓かなぁと思うんですが、pat_nodeがterminatedなのっ
>>> てこういう状況のときのことをいうのかよくわかっていません。
>>>
>>> diff --git a/lib/pat.c b/lib/pat.c
>>> index c5dacc0..afa8957 100644
>>> --- a/lib/pat.c
>>> +++ b/lib/pat.c
>>> @@ -667,6 +667,9 @@ _grn_pat_add(grn_ctx *ctx, grn_pat *pat, const
>>> uint8_t *key, uint32_t size, uint
>>>        for (c = 0, d = key; min && *s == *d; c += 16, s++, d++, min--);
>>>        if (min) {
>>>          for (xor = *s ^ *d, mask = 0x80; !(xor & mask); mask >>= 1, c +=
>>> 2);
>>> +        if (min == 1 && mask == (0x80 >> 7)) {
>>> +          c++;
>>> +        }
>>>        } else {
>>>          c--;
>>>        }
>>>
>>>
>>> In <CAPYq****@mail*****>
>>>   "[groonga-dev,03177] mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生" on Mon,
>>> 20 Apr 2015 11:57:15 +0900,
>>>   yuya sako <ysgon****@gmail*****> wrote:
>>>
>>> > ※先日、当MLに投稿いたしましたが、過去ログを確認しましたところ、
>>> > 4/19時点で投稿内容が残ってりませんでした為、念のため再投稿させていた
>>> > だきます。
>>> >
>>> > mroongaを使い始めた者なのですが、下記事象が発生いたしました。
>>> > 使い方に問題があるものなのかどうか等、ご教示頂けますと助かります。
>>> >
>>> > お手数をおかけいたしますが、よろしくお願いいたします。
>>> >
>>> > [事象]
>>> > 複数レコードをINSERT
>>> > ↓
>>> > INSERTしたレコードを全てDELETE
>>> > ↓
>>> > 再度同じレコードをINSERT
>>> >
>>> > を行うと、そのうち1件で下記エラーが発生いたします。
>>> >
>>> > ERROR 1062 (23000): Duplicate entry 'カラムの値' for key 'uid'
>>> >
>>> > ※再現手順を下記に記載いたしました。
>>> >
>>> > [使用環境]
>>> > # uname -a
>>> > Linux localhost1.local 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42
>>> > UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
>>> >
>>> > # mysql --version
>>> > mysql Ver 14.14 Distrib 5.6.23, for Linux (x86_64) using EditLine
>>> > wrapper
>>> >
>>> > mysql> show variables like '%mroonga%';
>>> > +----------------------------------------+---------------+
>>> > | Variable_name | Value |
>>> > +----------------------------------------+---------------+
>>> > | mroonga_action_on_fulltext_query_error | ERROR_AND_LOG |
>>> > | mroonga_boolean_mode_syntax_flags | DEFAULT |
>>> > | mroonga_database_path_prefix | |
>>> > | mroonga_default_parser | TokenBigram |
>>> > | mroonga_default_wrapper_engine | |
>>> > | mroonga_dry_write | OFF |
>>> > | mroonga_enable_optimization | ON |
>>> > | mroonga_libgroonga_support_lz4 | OFF |
>>> > | mroonga_libgroonga_support_zlib | ON |
>>> > | mroonga_libgroonga_version | 5.0.2 |
>>> > | mroonga_lock_timeout | 10000000 |
>>> > | mroonga_log_file | groonga.log |
>>> > | mroonga_log_level | NOTICE |
>>> > | mroonga_match_escalation_threshold | 0 |
>>> > | mroonga_vector_column_delimiter | |
>>> > | mroonga_version | 5.01 |
>>> > +----------------------------------------+---------------+
>>> >
>>> > [再現手順]
>>> > (1)テーブルの作成
>>> >
>>> > CREATE TABLE `uk_test` (
>>> > id int(10) unsigned not null,
>>> > uid varchar(150) not null,
>>> > data text not null,
>>> > primary key (id),
>>> > unique key uid (uid)
>>> > ) ENGINE=mroonga DEFAULT CHARSET=utf8;
>>> >
>>> > (2)データをINSERT
>>> > INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
>>> >
>>> > (3)データをDELETE
>>> > DELETE FROM uk_test WHERE `id`='1';
>>> > DELETE FROM uk_test WHERE `id`='2';
>>> > DELETE FROM uk_test WHERE `id`='3';
>>> > DELETE FROM uk_test WHERE `id`='4';
>>> >
>>> > (4)上記(2)と同じデータをINSERT
>>> > INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
>>> >
>>> > [補足-1]
>>> > 上記(2)、(4)で実行するINSER文を下記にしますと、事象が再現しなくなりま
>>> > す。
>>> > INSERT INTO uk_test (id,uid, data) VALUES (1,'uid1','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (2,'uid2','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
>>> >
>>> > [補足-2]
>>> > 上記(2)、(4)で実行するINSER文は下記3件でも、事象が再現いたします。
>>> > INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
>>> > INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
>>> >
>>> > 以上よろしくお願いいたします。
>>> >
>>> > -------------------------------------------------
>>> > 酒匂祐也
>>> > ysgon****@gmail*****
>>>
>>> _______________________________________________
>>> groonga-dev mailing list
>>> groon****@lists*****
>>> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>>>
>>
>>




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index