[groonga-dev,02223] Re: MroongaストレージモードでINSERT, DELETEが競合してクラッシュ

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 4月 15日 (火) 23:26:43 JST


須藤です。

In <CAHB5oTMCCxUkR13o5_o=6VAMK****@mail*****>
  "[groonga-dev,02222] MroongaストレージモードでINSERT, DELETEが競合してクラッシュ" on Tue, 15 Apr 2014 12:36:22 +0900,
  "yoku ts." <yoku0****@gmail*****> wrote:

> 恒例(?)のクラッシュ報告になります。。

ありがとうございます。。。

> 再現手順は以下の通りです。
> 
> #下準備
> mysql> CREATE DATABASE mroonga;
> mysql> CREATE TABLE test (num int) Engine= Mroonga;
> 
> # ターミナル1
> $ while true; do
>> mysql -e "INSERT INTO mroonga.test VALUES (1)"
>> done
> 
> # ターミナル2
> mysql> DELETE FROM mroonga.test;
> 
> 1回で落ちないこともたまにあったり(INSERT側でエラーが出たりしました)しますが、
> まあまあまず落ちます。
> 
> ご確認いただけますか?

直しました!

DELETE FROM tableがきたらTRUNCATE TABLE tableと同じ処理をする
ようにしていたんですが、TRUNCATEは速い代わりに他のコネクショ
ンがつないでいるときに実行してしまうとクラッシュするので、1
件ずつ削除するようにしました。

速く全レコードを消したくてTRUNCATE TABLEを使いたいときは、

  > LOCK TABLES mroonga.test WRITE;
  > TRUNCATE TABLE mroonga.test;
  > UNLOCK TABLES;

としてください!


余談: TRUNCATE TABLEが速いのは1件毎レコードを削除するのではな
く、テーブルをまるごと削除してから新しく作りなおしているから
です。なので、レコード件数が少ないときはDELETEの方が速いです。
まぁ、テスト用で頻繁にTRUNCATEしたくて、データ量がそんなに大
きくない場合は、MySQLのデータディレクトリーをtmpfsに置くのが
一番速いです。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

Groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援はじめました:
  http://www.clear-code.com/services/code-reader/




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