― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年5月10日(日) 01:06 
オフライン

登録日時: 2007年7月01日(日) 23:02
記事: 23
お住まい: 千葉
Firefox終了時にプロファイルフォルダ内にある、SQLiteDBのVACUUMとREINDEXを行おうとしています。
  1. xpcom-shutdownトピックのオブザーバの通知を受け取る
  2. それぞれのファイルへmozIStorageConnectionを作り、executeSimpleSQLでVACUUMとREINDEXを実行

という手順です。
しかし、常にformhistory.sqiteの部分でNS_ERROR_FILE_IS_LOCKの例外が投げられてしまいます。xpcom-shutdownはFirefox終了時に投げられるイベントの中でも最後の類になのでそのころにはDBへのアクセスはないと思っているのですが...
原因を知っている方は教えていただけないでしょうか。

私の日記(http://d.hatena.ne.jp/teramako/20090508/p1)に探った結果があるのですが、LOCKされている原因にはたどりつけていません。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年5月10日(日) 02:39 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 91
お住まい: 東京
試しにSQLite Managerでformhistory.sqliteに接続してみましたが、通常時(終了処理中とかではなく)だと普通に接続できますね。
SQLite Manager内部では普通にOpenDatabaseしてるだけなので、多分teramakoさんがやろうとしてることと同じ事をしてるはずなんですが、何故teramakoさんの場合はうまく行ってないのか……


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年5月10日(日) 04:58 
オフライン

登録日時: 2007年7月01日(日) 23:02
記事: 23
お住まい: 千葉
Piro さんが書きました:
試しにSQLite Managerでformhistory.sqliteに接続してみましたが、通常時(終了処理中とかではなく)だと普通に接続できますね。
SQLite Manager内部では普通にOpenDatabaseしてるだけなので、多分teramakoさんがやろうとしてることと同じ事をしてるはずなんですが、何故teramakoさんの場合はうまく行ってないのか……

すみません、ちょっと説明が足りませんでした。
OpenDatabaseはできます。SELECTもできます。しかし、VACUUM の実行で例外が投げられます。因みにINSERTも同様にLOCKされていてできませんでした。
VACUUMはDB全体に影響するので排他ロック相当のものが必要と思いますが、他のトランザクションが実行中であるためにVACUUM側でロックの取得ができず、例外が投げられているのではないかと思っています。

通常時であれば納得のいく話なのですが、xpcom-shutdownが投げられる段階になってもロックされているという例外が投げられてしまうのが腑に落ちないのです。


拡張のせいだったり、現在のプロファイルのせいだったりするかもしれませんので、新規プロファイル上でも試してみたいと思います。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年5月10日(日) 06:33 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 91
お住まい: 東京
これまたSQLite Managerでの実験結果ですが、Shiretokoで
INSERT INTO moz_formhistory (fieldname, value, timesUsed, firstUsed, lastUsed) VALUES("searchbar-history", "foobar", 1, 0, 0)
としてみたところ、特にエラーも起こらず成功してしまいました。
終了処理のタイミング特有の問題なのかもしれませんね。
ちなみにVACUUMは、Shiretokoだとエラーにならず、Firefox 3.0.10だとエラーになりました。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2009年5月10日(日) 13:43 
オフライン

登録日時: 2007年7月01日(日) 23:02
記事: 23
お住まい: 千葉
Piroさん、Shiretokoでの調査ありがとうございます。
Shiretokoだと大丈夫なんですね。

Shiretokoで思いついて、MXRでnsFormHistoryのソースを見比べてみたところ、Fx3.0のソース(http://mxr.mozilla.org/firefox/)とMozilla 1.9.1(http://mxr.mozilla.org/mozilla1.9.1/)のソースに違いがあることを発見しました。(当初、勘違いでMozilla 1.9.1のソースのみを読んでいて問題の発見が遅れました。すみません)

Fx3.0の方にはわざとトランザクションを維持させていると思われるコードがありました。(http://mxr.mozilla.org/firefox/source/toolkit/components/satchel/src/nsStorageFormHistory.cpp#745)
コード:
745 // nsFormHistory::StartCache
746 //
747 //    This function starts the dummy statement that locks the cache in memory.
748 //    As long as there is an open connection sharing the same cache, the cache
749 //    won't be expired. Therefore, we create a dummy table with some data in
750 //    it, and open a statement over the data. As long as this statement is
751 //    open, we can go fast.
752 //
753 //    This dummy statement prevents the schema from being modified. If you
754 //    want to add or change a table or index schema, you must stop the dummy
755 //    statement first. See nsNavHistory::StartDummyStatement for a slightly
756 //    more detailed discussion.
757 //
758 //    Note that we should not use a transaction in this function since that
759 //    will commit the dummy statement and everything will break.
760 //
761 //    This function also initializes the cache.


また、StopCache(StartCacheで作成したstatementのresetをする関数)もありましたが、どこからも呼ばれないみたいです。よって最後の最後までトランザクション張りっぱなしです。

反対にMozilla 1.9.1側のソース(http://mxr.mozilla.org/mozilla1.9.1/source/toolkit/components/satchel/src/nsStorageFormHistory.cpp)にはこれら処理はありませんでした。

これでFx3.0でVACUUMが失敗することも、Shiretokoでは問題ないことも説明がつきそうです。
問題の解決は無理そうですけど。。。

一応納得のいく結果となりましたので、これでクローズとしたいと思います。テスト等々ありがとうございました。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: Google Feedfetcher & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean