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