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



All times are UTC + 9 hours

返信する
ユーザー名:
件名:
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: ON
BBCode を無効にする
フォントサイズ:
フォントカラー
スマイリーを無効にする
URL を自動的にパースしない
ユーザエージェントを表示する
認証コード
KCaptcha by Nikita_Sp
   

トピックのレビュー - Firefox3.0のformhistory.sqliteがずっとLOCKされている
作成者 メッセージ
  記事の件名:  Re: Firefox3.0のformhistory.sqliteがずっとLOCKされている  引用付きで返信する
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では問題ないことも説明がつきそうです。
問題の解決は無理そうですけど。。。

一応納得のいく結果となりましたので、これでクローズとしたいと思います。テスト等々ありがとうございました。
投稿記事 Posted: 2009年5月10日(日) 13:43
  記事の件名:  Re: Firefox3.0のformhistory.sqliteがずっとLOCKされている  引用付きで返信する
これまた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日(日) 06:33
  記事の件名:  Re: Firefox3.0のformhistory.sqliteがずっとLOCKされている  引用付きで返信する
Piro さんが書きました:
試しにSQLite Managerでformhistory.sqliteに接続してみましたが、通常時(終了処理中とかではなく)だと普通に接続できますね。
SQLite Manager内部では普通にOpenDatabaseしてるだけなので、多分teramakoさんがやろうとしてることと同じ事をしてるはずなんですが、何故teramakoさんの場合はうまく行ってないのか……

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

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


拡張のせいだったり、現在のプロファイルのせいだったりするかもしれませんので、新規プロファイル上でも試してみたいと思います。
投稿記事 Posted: 2009年5月10日(日) 04:58
  記事の件名:  Re: Firefox3.0のformhistory.sqliteがずっとLOCKされている  引用付きで返信する
試しにSQLite Managerでformhistory.sqliteに接続してみましたが、通常時(終了処理中とかではなく)だと普通に接続できますね。
SQLite Manager内部では普通にOpenDatabaseしてるだけなので、多分teramakoさんがやろうとしてることと同じ事をしてるはずなんですが、何故teramakoさんの場合はうまく行ってないのか……
投稿記事 Posted: 2009年5月10日(日) 02:39
  記事の件名:  Firefox3.0のformhistory.sqliteがずっとLOCKされている  引用付きで返信する
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日(日) 01:06

All times are UTC + 9 hours


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