[groonga-dev,01778] Re: FW: mroonga適用テーブルへの「WHERE IN 多数」クエリでエラー

Back to archive index

Kimura A a.kim****@live*****
2013年 9月 16日 (月) 21:57:51 JST







木村です。
未解決ですが経過報告します。


現時点で、最も小さなテーブル構成で問題の再現を確認できたのは以下のケースです。

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` int(11) DEFAULT NULL,
  `description` text NOT NULL,
  `code` varchar(255) DEFAULT NULL,
  `tag_pool` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code_vendor_id` (`code`,`vendor_id`),
  FULLTEXT KEY `ft_all` (`description`,`code`,`tag_pool`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=mroonga AUTO_INCREMENT=45401 DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';


このテーブルに対して、100件ずつの一括INSERT処理を最大5分間にわたって連続実行するINSERTシェルを作成しました。
INSERTシェルによって投入されるのは以下のようなデータです。

・id:null
・vendor_id:1
・description:ソース文字列「abcde fghij klmno pqrst uvwxy zABCD EFGHI JKLMN OPQRS TUVWX YZ012 34567 89_-, .」からランダムに1文字ずつ切り出して並べていくことで構成した1000字の文字列。
・tag_pool:同上
・code:"code{$id}"(※変数$idは「その時点でのproducts.id最大値+1」。productsテーブルが空の場合は1)


このINSERTシェルと、既存のチェック用シェル(「SELECT * WHERE products.id IN ({300件})」クエリを実行して成否を記録するだけのCakePHPシェル。ここではSELECTシェルと呼ぶことにします)をcronから以下のように交互に実行します。

*/6 * * * * /usr/bin/php /var/www/vhosts/my-domain.com/cake/lib/Cake/Console/cake.php Insert
5-59/6 * * * * /usr/bin/php /var/www/vhosts/my-domain.com/cake/lib/Cake/Console/cake.php Select
5-59/6 * * * * /usr/bin/php /var/www/vhosts/my-domain.com/cake/lib/Cake/Console/cake.php Select

最大5分間INSERTシェルが走り、INSERTシェルの停止中にSELECTシェルが二重に走る、という組み合わせです。
このやり方で、空のproductsテーブルに対して2度のテストを行い、productsのレコード数がそれぞれ46000件と45400件に達した時点でエラーの再現が確認できました。


ただ、このやり方にもどうも問題がありそうです。
それというのも、このproductsテーブル(45400件でエラーの再現を確認できたときのもの)をテキストファイルにダンプして、

・productsテーブルを削除
・テキストファイルからproductsテーブルをインポート
・cronからSELECTシェルを二重実行

としてみても、エラーが再現しないんですよね。
ダンプしたデータ自体にはエラーを再現する条件が備わっていない(ように見える)、ということです。


さらに試みに、このインポートしたproductsテーブルに対して追加的に5分間のINSERTシェルと二重SELECTを交互に実行するという実験もやってみました。
すると1度目は計49600件になった段階で早々とエラーが再現したのですが、もう1度productsテーブルを消してインポートし直した状態から試すと、今度は計345300件になるまで続けてもエラーは再現しませんでした。

以上のように、再現条件の不確かさに悩まされ続けているのが現状です。
引き続き、フィールドを減らしての再現実験は続けてみるつもりですが、「エラーが発生したテーブルをダンプ→削除→インポートしてもエラーが再現しない」という問題をどう考えていいものかがわかりません。

引き続きアドバイスいただければ幸いです。
どうぞよろしくお願いしますm(_ _)m


 		 	   		  



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