[groonga-dev,03247] Re: mroongaで複数接続による同一レコードの登録、削除を繰り返すと、ユニーク制約が効かなくなる

Back to archive index

yoku ts. yoku0****@gmail*****
2015年 5月 19日 (火) 00:42:07 JST


こんばんは、yoku0825です。

Error 'Data truncated for column 't_date' at row 1'
'でSQLスレッド止まる件が全然再現しなくて困って(?)ます(´・ω・`)
↑のやつ、sql_mode= STRICT_ALL_TABLESにしてもワーニングで収まっちゃうんですね。
Handlerレイヤーのワーニングだからかしら。むーん。

こっちなら何となく想像がつきます。

> 確認した事項:
>
> replication は Slave側が 最初の Error 'Duplicate entry '10001' for key 'a_id''
> on query. Default database: 'db_test'.
> Query: 'INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001')'

マスター側は並列で突っ込んでくるので、
Mroongaさんのマルチスレッドアンセーフな部分ですり抜けて(?)NSERTが成功しそうですが、
スレーブ側ではバイナリーログ上にシリアライズされて1クエリーずつ実行されるので
本来マスターでも期待される通りユニークキー制約に引っかかっています。


これ、Data truncated for .. のやつとは別件ですよね。。(´・ω・`)
(最近あんまり時間が取れてなくて。。)






2015年5月18日 18:05 各務 洋 <kagam****@outwa*****>:
> お世話になります、各務です。
> ようやく Unique 制約のフィールドに重複して値が入るのが再現できました。
>
>
> ----------------------------------------------------------------------
> 現象:
>
> mroonga で複数の接続から同一レコードの登録、削除を繰り返すと、ユニーク
> 制約が効かず、重複したキーのレコードが複数登録される。
>
> 発生頻度は毎回。
>
>
> ----------------------------------------------------------------------
> 環境:
>
> CentOS 6.5
> groonga-libs.x86_64  5.0.3-1.el6
> mysql-community-mroonga.x86_64  5.02-1.el6
> mysql-community-server.x86_64  5.6.24-3.el6
> ストレージモード
> マスター/スレーブの2台構成です。
>
>
> ----------------------------------------------------------------------
> 再現手順:
>
> CREATE DATABASE db_test;
> USE db_test;
> CREATE TABLE `tbl_test_pat_0005` (
>         `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
>         `t1_date` TIMESTAMP NOT NULL DEFAULT current_timestamp,
>         `t2_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00',
>         `a_id` BIGINT(20) NOT NULL Default 0,
>         `t_text` LONGTEXT,
>         PRIMARY KEY (`id`),
>         UNIQUE KEY `a_id` (`a_id`),
>         FULLTEXT INDEX `t_text` (`t_text` ) COMMENT 'normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"'
> ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
> ;
>
> -- 下記を1000回繰り返すものを 「mix05.sql」 として準備
> INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001'); DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ; DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ;
>
>
> コンソール1から
> while true; do mysql -tN db_test <./mix05.sql|tee -a v1.txt; done
>
> 別接続のコンソール2から
> while true; do mysql -tN db_test <./mix05.sql|tee -a v2.txt; done
>
> 同3から
> while true; do mysql -tN db_test <./mix05.sql|tee -a v3.txt; done
>
> 同4から
> while true; do mysql -tN db_test <./mix05.sql|tee -a v4.txt; done
>
> しばらく待ってみてから Ctrl + C で止める。
>
> SELECT * FROM tbl_test_pat_0005;
> +------+---------------------+---------------------+-------+--------+
> | id   | t1_date             | t2_date             | a_id  | t_text |
> +------+---------------------+---------------------+-------+--------+
> | 6497 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6527 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6535 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6554 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6556 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6674 | 2015-05-18 12:58:52 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6707 | 2015-05-18 12:58:53 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 6837 | 2015-05-18 12:58:56 | 0000-00-00 00:00:00 | 10001 | t10001 |
> |    0 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |     0 |        |
> | 2791 | 2015-05-18 12:58:12 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 4057 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 4135 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 4315 | 2015-05-18 12:58:28 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 4436 | 2015-05-18 12:58:30 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 4559 | 2015-05-18 12:58:31 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 5052 | 2015-05-18 12:58:35 | 0000-00-00 00:00:00 | 10001 | t10001 |
> | 5078 | 2015-05-18 12:58:36 | 0000-00-00 00:00:00 | 10001 | t10001 |
> +------+---------------------+---------------------+-------+--------+
>
> と、Unique が期待される a_id に値が重複して登録されている。
> id 0 のレコードが出来ている。
>
>
> ----------------------------------------------------------------------
> 期待する動作:
>
> Unique 制約を保って欲しい
> replication が切れないようにして欲しい。(← 自分用メモ:slave_exec_mode を戻してみる)
> id 0 のレコードが残らないようにして欲しい。
>
>
> ----------------------------------------------------------------------
> 確認した事項:
>
> replication は Slave側が 最初の Error 'Duplicate entry '10001' for key 'a_id''
> on query. Default database: 'db_test'.
> Query: 'INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001')'
>
> で切断され、重複した値は入っていませんでした。
>
> もっとシンプルなテストだと、重複が発生しないのもありました。
>
> 上記でいかがでしょうか?よろしくお願いします。
>
>
>
> ----
> 各務
> kagam****@outwa*****
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev



groonga-dev メーリングリストの案内
Back to archive index