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

Back to archive index

各務 洋 kagam****@outwa*****
2015年 5月 13日 (水) 20:36:05 JST


お世話になります、各務と申します。

この題名のものを確認していたら、発生したので同じで送らせていただきます。
(原因は前回とは別だと思います)

----------------------------------------------------------------------
現象:

同一レコードの登録、削除、登録を行うとユニークキー重複エラーが発生する。
レプリケーションが最初の登録の時点で切断される。

発生頻度は毎回。

----------------------------------------------------------------------
環境:

CentOS 6.4
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 TABLE `tbl_test_pat_0001` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`t_key` VARCHAR(255) NOT NULL,
	`t_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	PRIMARY KEY (`id`),
	UNIQUE KEY `uidx_tbl_test_t_key_t_date` (`t_key`,`t_date`)
) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00');
DELETE FROM tbl_test_pat_0001 WHERE id = 1;
INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00');

で、
ERROR 1062 (23000): Duplicate entry 'test1-0000-00-00 00:00:00' for key 'uidx_tbl_test_t_key_t_date'

が発生します。

----------------------------------------------------------------------
期待する動作:

重複してなければ、登録可能にして欲しい。
レプリケーション状態を続行して欲しい。

----------------------------------------------------------------------
確認した事項:

最初の INSERT で、warning が発生。

| Error | 1265 | Data truncated for column 't_date' at row 1 |

その時点で SELECT すると

+----+-------+---------------------+
| id | t_key | t_date              |
+----+-------+---------------------+
|  1 | test1 | 0000-01-01 00:00:00 |
+----+-------+---------------------+

と、0000-00-00 が 0000-01-01 00:00:00 になっている。
(※ mroongaストレージエンジンは月や日の値に指定された0を1へと自動的に補正します。なので)

この際、スレーブ側へのレコード登録は「0000-01-01 00:00:00」で成功するが、
レプリケーションは切断される。

Error 'Data truncated for column 't_date' at row 1' on query. Default database: 'db_test'. 
Query: 'INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00')' 

その後、DELETEし、再 INSERT 時のエラーが
| Error | 1062 | Duplicate entry 'test1-0000-00-00 00:00:00' for key 'uidx_tbl_test_t_key_t_date' |

となるので、truncate する前の値で index を作成し、削除し損ねているのではないのでしょうか?

----------------------------------------------------------------------
その他の事項:

実は、DATETIME型ではなく、TIMESTAMP型 でレプリケーションが切断されるの
を探していました。index 等は関係なく。
(あと、mroonga テーブルの破損……)

福岡Groonga1 で再現できたらお送りしたいというのがすっかり遅くなって
しまいましたが、ようやく最新の環境でテストできました。

TIMESTAMP型ではまだ見つかっておりません。

collisions(xxxxxxxx/xxxxxxx): lock failed 1000 times 
が頻発するのも気になっていますが。

何か他にお気づきの点があれば、ご指摘いただけると助かります。

よろしくお願いいたします。


----
各務 
kagam****@outwa*****




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