Kouhei Sutou
kou****@clear*****
2015年 7月 14日 (火) 22:47:37 JST
須藤です。 In <20150****@orega*****> "[groonga-dev,03359] Re: PGROONGAで障害発生" on Fri, 10 Jul 2015 15:44:45 +0900, 高見 直輝 <takam****@orega*****> wrote: >> こちらでも再現させたいので具体的な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回繰り返すとこの状態になります。 > 一度この状態になると、毎回エラーが発生するようになります。 ありがとうございます! Windows 7 Home Premium 64bitの環境を用意して試してみました。 が、再現しませんでした。。。。 バージョン: * 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 * ↓のバッチファイルを作ってビルド del /Q CMakeCache.txt rmdir /S /Q CMakeFiles cmake . -G "Visual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=..\postgresql-9.3.9-1-windows-x64-binaries\pgsql cmake --build . --config Debug cmake --build . --config Debug --target Install 再現方法: 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; ↓の内容のx.sqlを用意。 (「USER」が予約語なので「"USER"」にしている以外は教えてもらっ たSQLと同じ) -- 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; -- 「\i x.sql」を何度も実行。 pgroonga_test# \i x.sql pgroonga_test# \i x.sql pgroonga_test# \i x.sql pgroonga_test# \i x.sql pgroonga_test# \i x.sql pgroonga_test# \i x.sql 再現せず。。。どうしてだろう。。。 >> * TRUNCATE >> * SELECT >> >> を提供してもらえると助かります。 > > 以下のSQLです。 > truncate TEST20150710; > select * from TEST20150710 where lower(USERNAME) %% lower('Test'); ありがとうございます! >> 可能なら、テストデータを投入するINSERTも提供してもらえるとこ >> ちらでテストデータを考えなくてよくなるので助かります。 > > どうも、レコードが登録されると発生しなくなるような感じです。 それは妙ですねぇ。 > 一応、Insert文を。 > insert into TEST20150710 (ZIPCODE,USERNAME,ADDRESS,DESCRIPTION) values ('123','テスト太郎','JAPAN','これはテスト用レコードです'); ありがとうございます! > ビルドその他に失敗している可能性は有るでしょうか? > あと、postgresql-9.3.6で構築し、postgresql-9.3.8にアップデートしているの > ですが、影響有りますでしょうか? > postgresql-9.3.8でのpgroongaのビルドは行っていません。 うーん、マイクロバージョンが変わっただけなら大丈夫そうな気が しますが。。。ただ、オススメはビルドするPostgreSQLと使う PostgreSQLのバージョンを同じにすることです。 >> > 【障害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| となったログがでる気がするんですけど。。。