高見 直輝
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