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

Back to archive index

高見 直輝 takam****@orega*****
2015年 7月 15日 (水) 15:33:38 JST


高見です。

検証ありがとうございます。
こちらでも検証した結果、再現しましたので報告します。

> バージョン:
> 
>   * PostgreSQL: 9.3.9-1
>     * http://get.enterprisedb.com/postgresql/postgresql-9.3.9-1-windows-x64-binaries.zip
>     * ただし、↑はlibintl.hが入っていなくてビルドエラーにな
>       るので9.4.2-1に入っているlibintl.hをコピーして使いまし
>       た。
>     * これは9.4系でも同じなのでバグレポート済み:
>       http://www.postgresql.org/message-id/20150****@wrigl*****
> 
>   * PGroonga: 0.7.0

当方ではPostgreSQL9.3.8を使用しました。libintl.hの対処も上記の通り。
あとの手順はマニュアル通りです。

> 再現方法:
> 
> PostgreSQLを初期化して起動。
> 
>   > bin\initdb.exe -D data
>   > bin\postgres.exe -p 15678 -D data
> 
> 準備。
> 
>   > bin\psql.exe -p 15678 postgres
>   postgres=# create database pgroonga_test;
>   postgres=# \c pgroonga_test
>   pgroonga_test=# create extension pgroonga;

こちらではpg_ctl.exeを使用してDBサーバを起動しています。
なお、実行ユーザはSYSTEM(ローカルシステム)ユーザです。

> > ビルドその他に失敗している可能性は有るでしょうか?
> > あと、postgresql-9.3.6で構築し、postgresql-9.3.8にアップデートしているの
> > ですが、影響有りますでしょうか?
> > postgresql-9.3.8でのpgroongaのビルドは行っていません。
> 
> うーん、マイクロバージョンが変わっただけなら大丈夫そうな気が
> しますが。。。ただ、オススメはビルドするPostgreSQLと使う
> PostgreSQLのバージョンを同じにすることです。

今回は postgresql-9.3.8でビルドしました。
ただし、DBは9.3.6のときに構築したものを、そのまま使用しています。

> >> > 【障害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のログを見せてもらえませんか?
> >> 
> >>   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='');
> 
> あれ、これだけでした?
> これはうまく動いているときのログですか?失敗している時のログ
> ですか?失敗しているときは、この後に、
> 
>   pgroonga: ${タイムスタンプ}|n|
> 
> ではなく
> 
>   pgroonga: ${タイムスタンプ}|e|
> 
> となったログがでる気がするんですけど。。。

前回、イベントログに出力されていたのは上記のもので全てでした。
今回、再現したときのログをpgroonga.logから取得しましたので以下に記します。
 16:43:20 ⇒ テーブル削除(成功)
 16:43:25 ⇒ テーブル再作成(失敗)
 16:46:43 ⇒ 16:43:25の処理を再実行(失敗)

2015-07-14 16:43:20.030000|n| grn_init
2015-07-14 16:43:20.805000|n| DDL:obj_remove Lexicon396917_0.index
2015-07-14 16:43:20.810000|e| syscall error 'base/16384/pgrn.000042E' (Permission denied)
2015-07-14 16:43:20.810000|e| failed to remove path: <base/16384/pgrn.000042E>
2015-07-14 16:43:20.810000|n| DDL:obj_remove Sources396917.ctid
2015-07-14 16:43:20.811000|e| syscall error 'base/16384/pgrn.000042B' (Permission denied)
2015-07-14 16:43:20.811000|e| failed to remove path: <base/16384/pgrn.000042B>
2015-07-14 16:43:20.811000|n| DDL:obj_remove Sources396917.lower
2015-07-14 16:43:20.812000|e| syscall error 'base/16384/pgrn.000042C' (Permission denied)
2015-07-14 16:43:20.812000|e| failed to remove path: <base/16384/pgrn.000042C>
2015-07-14 16:43:20.813000|n| DDL:obj_remove Lexicon396917_0
2015-07-14 16:43:20.813000|e| syscall error 'base/16384/pgrn.000042D' (Permission denied)
2015-07-14 16:43:20.813000|e| failed to remove path: <base/16384/pgrn.000042D>
2015-07-14 16:43:20.813000|n| DDL:obj_remove Sources396917
2015-07-14 16:43:20.814000|e| syscall error 'base/16384/pgrn.000042A' (Permission denied)
2015-07-14 16:43:20.814000|e| failed to remove path: <base/16384/pgrn.000042A>
2015-07-14 16:43:20.818000|n| DDL:obj_remove Lexicon396920_0.index
2015-07-14 16:43:20.823000|e| syscall error 'base/16384/pgrn.0000438' (Permission denied)
2015-07-14 16:43:20.823000|e| failed to remove path: <base/16384/pgrn.0000438>
2015-07-14 16:43:20.823000|n| DDL:obj_remove Sources396920.ctid
2015-07-14 16:43:20.823000|e| syscall error 'base/16384/pgrn.0000435' (Permission denied)
2015-07-14 16:43:20.823000|e| failed to remove path: <base/16384/pgrn.0000435>
2015-07-14 16:43:20.824000|n| DDL:obj_remove Sources396920.lower
2015-07-14 16:43:20.825000|e| syscall error 'base/16384/pgrn.0000436' (Permission denied)
2015-07-14 16:43:20.825000|e| failed to remove path: <base/16384/pgrn.0000436>
2015-07-14 16:43:20.825000|n| DDL:obj_remove Lexicon396920_0
2015-07-14 16:43:20.825000|e| syscall error 'base/16384/pgrn.0000437' (Permission denied)
2015-07-14 16:43:20.825000|e| failed to remove path: <base/16384/pgrn.0000437>
2015-07-14 16:43:20.826000|n| DDL:obj_remove Sources396920
2015-07-14 16:43:20.826000|e| syscall error 'base/16384/pgrn.0000434' (Permission denied)
2015-07-14 16:43:20.826000|e| failed to remove path: <base/16384/pgrn.0000434>
2015-07-14 16:43:20.830000|n| DDL:obj_remove Lexicon396918_0.index
2015-07-14 16:43:20.835000|e| syscall error 'base/16384/pgrn.0000433' (Permission denied)
2015-07-14 16:43:20.835000|e| failed to remove path: <base/16384/pgrn.0000433>
2015-07-14 16:43:20.835000|n| DDL:obj_remove Sources396918.ctid
2015-07-14 16:43:20.836000|e| syscall error 'base/16384/pgrn.0000430' (Permission denied)
2015-07-14 16:43:20.836000|e| failed to remove path: <base/16384/pgrn.0000430>
2015-07-14 16:43:20.836000|n| DDL:obj_remove Sources396918.lower
2015-07-14 16:43:20.837000|e| syscall error 'base/16384/pgrn.0000431' (Permission denied)
2015-07-14 16:43:20.837000|e| failed to remove path: <base/16384/pgrn.0000431>
2015-07-14 16:43:20.837000|n| DDL:obj_remove Lexicon396918_0
2015-07-14 16:43:20.838000|e| syscall error 'base/16384/pgrn.0000432' (Permission denied)
2015-07-14 16:43:20.838000|e| failed to remove path: <base/16384/pgrn.0000432>
2015-07-14 16:43:20.838000|n| DDL:obj_remove Sources396918
2015-07-14 16:43:20.838000|e| syscall error 'base/16384/pgrn.000042F' (Permission denied)
2015-07-14 16:43:20.838000|e| failed to remove path: <base/16384/pgrn.000042F>
2015-07-14 16:43:25.505000|n| DDL:table_create Sources396978
2015-07-14 16:43:25.505000|e| syscall error 'CreateFile' (ファイルがあります。)[80]
2015-07-14 16:43:25.505000|e| CreateFile(<base/16384/pgrn.000042F>, <O_RDWR|O_CREAT|O_EXCL>) failed
2015-07-14 16:43:25.535000|n| DDL:table_create Sources396992
2015-07-14 16:43:25.535000|e| CreateFile(<base/16384/pgrn.000042F>, <O_RDWR|O_CREAT|O_EXCL>) failed
2015-07-14 16:46:43.689000|n| DDL:table_create Sources397006
2015-07-14 16:46:43.689000|e| syscall error 'CreateFile' (ファイルがあります。)[80]
2015-07-14 16:46:43.689000|e| CreateFile(<base/16384/pgrn.000042F>, <O_RDWR|O_CREAT|O_EXCL>) failed
2015-07-14 16:46:43.718000|n| DDL:table_create Sources397020
2015-07-14 16:46:43.718000|e| CreateFile(<base/16384/pgrn.000042F>, <O_RDWR|O_CREAT|O_EXCL>) failed
2015-07-14 18:03:00.947000|n| (1 same messages are truncated)
2015-07-14 18:03:00.967000|n| (1 same messages are truncated)
2015-07-14 18:03:00.976000|n| grn_fin (5)
2015-07-14 18:03:00.976000|n| grn_fin (0)

状況としては、
1)テーブル削除時、pgrn.000042Fの削除に失敗 (Permission denied)
2)テーブル削除成功
3)テーブル(インデックス)作成時、pgrn.000042Fの作成に失敗(ファイル既存?)
といったところでしょうか?

1のPermission deniedについて、pgrn.000042Fのアクセス権を調べましたが、
所有者:SYSTEM
アクセス権@SYSTEM:フルコントロール[許可]
となっており、“削除権限がない”という状態ではありませんでした。

3について、以下のファイルを手動で削除したところ、テーブル作成が正常に完了しました。
pgrn.000042A
pgrn.000042B
pgrn.000042C
pgrn.000042D
pgrn.000042E
pgrn.000042F
pgrn.0000430
pgrn.0000431
pgrn.0000432
pgrn.0000433
pgrn.0000434
pgrn.0000435
pgrn.0000436
pgrn.0000437
pgrn.0000438
pgrn.000042E.c
pgrn.0000433.c
pgrn.0000438.c

以上、報告まで。

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




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