[groonga-dev,03359] Re: PGROONGAで障害発生

Back to archive index

高見 直輝 takam****@orega*****
2015年 7月 10日 (金) 15:44:45 JST


高見です。

> こちらでも再現させたいので具体的なSQLを提供してもらえないでしょうか?

各種CREATE、DROP文は以下の通りです。
CREATE TABLE TEST20150710(
 ID SERIAL NOT NULL,
 ZIPCODE VARCHAR(32) NOT NULL,
 USER VARCHAR(128) NOT NULL,
 ADDRESS VARCHAR(256),
 DESCRIPTION TEXT,
 CONSTRAINT TEST20150710_PKEY PRIMARY KEY (ID)
)WITH (OIDS=FALSE);
CREATE INDEX TEST20150710_ZIP ON TEST20150710(ZIPCODE);
CREATE INDEX TEST20150710_USER ON TEST20150710 USING pgroonga (lower(USER)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');
CREATE INDEX TEST20150710_ADDRESS ON TEST20150710 USING pgroonga (lower(ADDRESS)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');
CREATE INDEX TEST20150710_path ON TEST20150710 USING pgroonga (lower(DESCRIPTION)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');

DROP TABLE TEST20150710;

現状判明している障害発生手順は、以下の通りです。
1.CREATE TABLEとCREATE INDEXを実行
2.DROP TABLEを実行
3.CREATE TABLEとCREATE INDEXを実行

エラーが発生するようになるまでに、1と2を何回か繰り返し実行する必要が有
ります。
私の環境では2〜3回繰り返すとこの状態になります。
一度この状態になると、毎回エラーが発生するようになります。

> (CREATE TABLEではなくCREATE INDEXのときにエラーが発生するんですよね?)

その通りです。上記の例で言うと、CREATE INDEX TEST20150710_ZIPは問題なく
終了し、CREATE INDEX TEST20150710_USER以下、pgroongaのインデックスでのみ
エラーとなります。


>   * TRUNCATE
>   * SELECT
> 
> を提供してもらえると助かります。

以下のSQLです。
truncate TEST20150710;
select * from TEST20150710 where lower(USERNAME) %% lower('Test');

Select文について、pgroongaのインデックスを貼っていないカラムに対する条件
指定だと問題は発生しません。
select * from TEST20150710 where ZIPCODE = 'Test';

> 可能なら、テストデータを投入するINSERTも提供してもらえるとこ
> ちらでテストデータを考えなくてよくなるので助かります。

どうも、レコードが登録されると発生しなくなるような感じです。
一応、Insert文を。
insert into TEST20150710 (ZIPCODE,USERNAME,ADDRESS,DESCRIPTION) values ('123','テスト太郎','JAPAN','これはテスト用レコードです');

> それで、現時点で提供してもらっている情報からの予想ですが。。。
> 
> > 【環境】
> > Windows Server 2008R2
> > postgresql-9.3.8-1
> > pgroonga-0.6.0
> 
> Windowsかどうかは関係なさそうだなぁという気がしています。

ビルドその他に失敗している可能性は有るでしょうか?
あと、postgresql-9.3.6で構築し、postgresql-9.3.8にアップデートしているの
ですが、影響有りますでしょうか?
postgresql-9.3.8でのpgroongaのビルドは行っていません。

> > 【障害1】
> > PGROONGAを利用したインデックスを作成しようとすると以下のエラーが発生する。
> >  pgroonga: failed to create table: syscall error 'CreateFile' 
> >  PostgreSQLエラーコード:58000(system_error)
> > この状態になると、table_createコマンドを実行しても同様のエラーとなる。以下、実行結果。
> >  "[[-17,1436422104.356,0.00500011444091797,"syscall error 'CreateFile' (",[["grn_fileinfo_open_common","C:\\pgroonga-0.6.0\\vendor\\groonga\\lib\\io.c",1490]]],false]"
> > テーブルをDROPした後、同一構成のテーブルをCREATEしようとすると発生し易い。
> > 1テーブルあたりのインデックスが増える毎に発生頻度が高くなる傾向がある。
> 
> vacuumdb.exeを実行すると回復するかもしれません。
> (SQLのVACUUMだとダメです。)

vacuumdb.exeを-aオプション付きで実行しましたが、回復しませんでした。
念のためSQLのVACUUMも試しましたが、こちらも駄目です。

> PostgreSQLはDROPしてもすぐにはテーブルやインデックスの実体を
> 削除しません。削除しないということはリソースを使ったままとい
> うことです。使用リソースが増えてしまってエラーが発生している
> のではないかと思います。
> 
> > システム時計を1日以上進めると、回復することがある。
> 
> ということなので、自動でvacuumdb.exeが走ったのではないかと思
> います。
> 
> 何度もDROP→CREATEを繰り返しているようなので、システムのリソー
> スが枯渇しているかもしれません。問題が発生したときのシステム
> のリソース使用状況(主にメモリー)を確認してみてください。

増えてはいましたが、枯渇するほどではありませんでした。(1GB程度の空き)

> また、PostgreSQLのログを見せてもらえませんか?
> 
>   pgroonga: failed to create table: syscall error 'CreateFile'
> 
> 以上の情報が残っているはずなのです。

CREATE INDEX を実行したときに出力されたログです。
LOG:  pgroonga: 2015-07-10 14:26:33.660000|n| DDL:table_create Sources372310
STATEMENT:  CREATE INDEX TEST20150710_USER ON TEST20150710 USING pgroonga (lower(USERNAME)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');
LOG:  pgroonga: 2015-07-10 14:26:36.934000|n| DDL:table_create Sources372311
STATEMENT:  CREATE INDEX TEST20150710_ADDRESS ON TEST20150710 USING pgroonga (lower(ADDRESS)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');
LOG:  pgroonga: 2015-07-10 14:26:40.859000|n| DDL:table_create Sources372312
STATEMENT:  CREATE INDEX TEST20150710_DSC ON TEST20150710 USING pgroonga (lower(DESCRIPTION)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer='');

> ちなみに、次のリリース(0.7.0)からはデータベース毎にログを
> 出力するようになります。データベースがあるフォルダーに
> pgroonga.logができてそこに出力されます。
> 
> > 【障害2】
> > TRUNCATEを実行するとSelectでSQLエラーが発生するようになる。
> >  PostgreSQLエラーコード:42602(invalid_name)
> > TRUNCATEを実行する前には問題無く動いていたSQLが、実行後にエラーとなる。
> > pgroongaを利用したインデックスを張っているカラムをWhere句で使用した場合にのみ発生。
> >  ⇒上記テーブルで、IDで検索すると大丈夫だが、USERで検索するとエラーとなる。
> 
> 試しにTRUNCATEを使ったテストを追加してみたのですが、
> 
>   https://github.com/pgroonga/pgroonga/blob/master/sql/full-text-search/text/single/truncate.sql
> 
> ↓という結果になり
> 
>   https://github.com/pgroonga/pgroonga/blob/master/expected/full-text-search/text/single/truncate.out
> 
> 正常に動作していました。
> 
> もしかしたら、【障害1】と関係があるか、別の要因があるのかもしれません。

【障害1】が発生していない環境では確認できていないので、関係が有る可能性
は高いです。

----------------------------- 
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180




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