[groonga-dev,03229] mroongaで同一レコードの登録、削除を繰り返すと値が抜ける事がある

Back to archive index

各務 洋 kagam****@outwa*****
2015年 5月 14日 (木) 18:30:39 JST


お世話になります、各務です。

同一レコードの登録、削除を連続で繰り返すと、値が抜けた状態で保存される
のが見えましたのでお送りします。

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

同一レコードの登録、削除を連続で行うと、期待通りに値が保存されない事がある。

発生頻度は毎回。

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

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_0002` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`a_id` BIGINT(20) NOT NULL Default 0,
	`t_key` VARCHAR(255) NOT NULL,
	`t_date` TIMESTAMP NOT NULL DEFAULT current_timestamp,
	PRIMARY KEY (`id`),
	UNIQUE KEY `a_id` (`a_id`),
	UNIQUE KEY `uidx_tbl_test_t_key_t_date` (`t_key`,`t_date`)
) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


-- 下記を1万回繰り返すものを 「1.sql」 として準備
INSERT INTO tbl_test_pat_0002 (a_id, t_key, t_date) VALUES (1, 'test1', '0000-00-00');
DELETE FROM tbl_test_pat_0002 WHERE a_id = 1;

-- 表示用を 「s1.sql」として準備
SELECT * FROM tbl_test_pat_0002;

-- ここから OS の console で 表示用のSQLを連続で起動
while true; do mysql -tN db_test <./s1.sql|tee -a v1.txt; done

-- 別 console で、INSERT/DELETE を起動。
mysql db_test < 1.sql 

while で回している画面をみると。

+------+---+-------+---------------------+
| 1517 | 1 | test1 | 0000-00-00 00:00:00 |
+------+---+-------+---------------------+
+---+---+--+---------------------+
| 0 | 0 |  | 0000-00-00 00:00:00 |
+---+---+--+---------------------+
+------+---+-------+---------------------+
| 1534 | 1 | test1 | 0000-00-00 00:00:00 |
+------+---+-------+---------------------+
+------+---+--+---------------------+
| 2113 | 0 |  | 0000-00-00 00:00:00 |
+------+---+--+---------------------+

等、値が抜けているのが確認できる。

(主キーの値は「アテ」、実際の値はwhileの間隔次第)


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

値が抜けないようにして欲しい。


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

Slave 側でも同じ while を回すと、同様の出力が確認できた。
ENGINE = innodb で作成すると発生しない。(そして遅い)

実際に
+---+---+--+---------------------+
| 0 | 0 |  | 0000-00-00 00:00:00 |
+---+---+--+---------------------+
で止まった状態のレコードは確認できなかったものの、このテストとは別件で、
数日前に本番環境でリリース準備をしていたところ、テーブルが壊れたとの報
告があり、確認したところ

+---+---+--+---------------------+
| 0 | 0 |  | 0000-00-00 00:00:00 |
| 0 | 0 |  | 0000-00-00 00:00:00 |
+---+---+--+---------------------+
このような2レコードのみが格納された状態になっていました。
※本番環境 mroonga 4.01


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




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