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



All times are UTC + 9 hours

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

トピックのレビュー - 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について
作成者 メッセージ
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
Bug 673703 の修正がリリース版 115.3.0 に反映されました。
引用:
投稿記事 Posted: 2023年9月26日(火) 06:44
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
Bug 673703 ですが、無事修正されてクローズされました。
Thunderbird 118.0b4 にも反映されています。

下記PowerShellスクリプトで一時ファイルがThunderbird起動時に残らず削除されることを確認しました。
コード:
# Testing MsgCleanupTempFiles()

New-Item $env:temp\nsmail.tmp -type file -Force
New-Item $env:temp\nscopy.tmp -type file -Force
New-Item $env:temp\nsemail.eml -type file -Force
New-Item $env:temp\nsemail.tmp -type file -Force
New-Item $env:temp\nsqmail.tmp -type file -Force

for ($i=1; $i -le 9999; $i++) {
  $f = $env:temp + "\nsmail-" + $i + ".tmp"
  New-Item $f -type file -Force
  $f = $env:temp + "\nscopy-" + $i + ".tmp"
  New-Item $f -type file -Force
  $f = $env:temp + "\nsemail-" + $i + ".eml"
  New-Item $f -type file -Force
  $f = $env:temp + "\nsemail-" + $i + ".tmp"
  New-Item $f -type file -Force
  $f = $env:temp + "\nsqmail-" + $i + ".tmp"
  New-Item $f -type file -Force
}

Start-Process -FilePath "C:\Program Files\Mozilla Thunderbird beta\thunderbird.exe"

あとはリリース版への反映を待つのみです。
投稿記事 Posted: 2023年9月15日(金) 01:34
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
Bug 673703 なのですが、どうにも歯がゆい状況になってまして・・・
私が提案した対策のための修正コードは、他の方のアドバイス意見も加味されてきっちり確定しました。
にもかかわらず、それを修正パッチとして登録する手続きに手間取って停滞しています。

修正パッチの作成に手を上げてくれた方がいて、お試しで try-comm-central レポジトリ(Thunderbirdの本番レポジトリは comm-central)にコミットされたのですが、phabricator を経由してパッチを提出する必要があるという指摘を受けました。

その方は phabricator をセットアップして動作させるには数日必要ということでしたが、結局 phabricator にパッチが登録されたのはそこから1.5週間ほど後となりました。
そして、そのパッチ内容に不足があり更新が必要となったのですが、その手順も手探りの状況です。
1~2日待ってくださいということだったのですが、そこからさらに1週間経ちますが動きがない状況です。

私がビルド環境も必要なアカウントもないのでやっていただけることはありがたいのですが、普段から修正パッチの提出フローに慣れている方ならサクッと終わる作業のはず。
そもそもまだ「Assignee: Unassigned」でして、こういうのってQAの人が適切な担当者をアサインするものだと思ってたのですが・・・どうなんでしょうね。
投稿記事 Posted: 2023年8月08日(火) 00:30
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
ついに、 Bug 673703 に Magnus Melin さんが反応してくれました。
解決に向かいそうな予感・・・
投稿記事 Posted: 2023年7月18日(火) 21:54
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
EarlgreyTea さんが書きました:
一方、「nsemail.eml」と「nsqmail.tmp」は上記処理の対象に含まれておらず、送信処理や後で送信の処理が完了する前に異常終了するような状況があれば一時ファイルが消去されずに残り、それを繰り返せば少しづつ枝番ファイルは増えていくでしょう。

検証してみました。

  1. Windowsの「%TEMP%」フォルダーの不要ファイルをすべて削除しておきます。
  2. Thunderbirdを起動し、下記のメッセージフィルターを設定します。
    • フィルターを適用するタイミング:「アーカイブ時」
    • 「条件なし」
    • 以下の動作を実行する:「メッセージを転送する」「転送先のメールアドレス」
  3. PCのインターネット接続を切断します。
  4. 受信トレイのメールを100件選択して「アーカイブ」を実行します。
  5. アーカイブは100件終わってますが、連動して行われる転送送信は完了しません。
    • 画面にはダイアログにならないプログレスバーのようなものが表示され、フォーカスが奪われて操作不能となる。
      添付ファイル:
      バグった進行状況表示?.jpg
      バグった進行状況表示?.jpg [ 83.47 KiB | 表示数: 6354 回 ]
    • Tempフォルダーには、nsemail.eml、nsemail-1 ~ nsemail-86.eml が作成されていることを確認。
  6. Thunderbirdをタスクマネージャーから強制終了させます。
  7. Thunderbirdを再度起動します。
  8. Tempフォルダーには、一時ファイルが消されずにそのまま残っています。

という結果となりました。
nsemail.eml の枝番ファイルを作成してそれが消えないという状況を発生させることができましたが、一度にせいぜい86個が限度という感じです。
しかも毎度Thunderbirdが操作不能になって強制終了をかける、そんな異常事態を100回以上も放置しているとか、ちょっと考えにくいですね。
投稿記事 Posted: 2023年6月11日(日) 19:40
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
「nsmail.tmp」と「nscopy.tmp」については、Thunderbirdが起動する際に下記の処理にて削除が行われています。
https://searchfox.org/comm-central/sour ... ce.cpp#121
コード:
nsresult nsMsgComposeService::Init() {
  nsresult rv = NS_OK;

  Reset();

  AddGlobalHtmlDomains();
  // Since the compose service should only be initialized once, we can
  // be pretty sure there aren't any existing compose windows open.
  MsgCleanupTempFiles("nsmail", "tmp");
  MsgCleanupTempFiles("nsemail", "html");
  MsgCleanupTempFiles("nscopy", "tmp");
  return rv;
}

したがって、私がやったように意図的に状況を作らない限り、枝番ファイルが9999に到達してNS_ERROR_FILE_TOO_BIGエラーが発生することは考えにくいです。

一方、「nsemail.eml」と「nsqmail.tmp」は上記処理の対象に含まれておらず、送信処理や後で送信の処理が完了する前に異常終了するような状況があれば一時ファイルが消去されずに残り、それを繰り返せば少しづつ枝番ファイルは増えていくでしょう。

ただ、そういうトラブルが1万回も続き、ユーザーもそれをおかしいと思わずに放置するという状況は現実的ではない気がします。
仮に毎日1回トラブルが起きる状況だったとして、9999に到達するまでには27年以上かかる計算です。一気に千個単位で一時ファイルが増殖するような状況が無いと厳しいかと思います。

そこについては不明ではありますが、Thunderbird起動時の初期処理「nsMsgComposeService::Init()」に、
コード:
  MsgCleanupTempFiles("nsemail", "eml");
  MsgCleanupTempFiles("nsqmail", "tmp");
を追加すれば、発生を防止することが可能でしょう。

Bug 673703 にファイル削除処理の追加についてコメントしておきました。
投稿記事 Posted: 2023年6月11日(日) 14:47
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
メール処理関連で同じ名前で使い回す主要な一時ファイルを調べてみました。

■「nsemail.eml」
  • メール送信時の送信データ構築に使われます。
  • Thunderbirdを再起動しても、残っていた一時ファイルは削除されません。

■「nsqmail.tmp」
  • 「後で送信」において使われます。
  • Thunderbirdを再起動しても、残っていた一時ファイルは削除されません。

■「nsmail.tmp」
  • 添付ファイル作成のAPI「nsMsgCreateTempFile」で無指定の場合のデフォルトファイル名になっているため、詳細の把握は難しいですがわかってる分では以下の際に使われているようです。
    • メールをテンプレートとして保存する
    • 添付ファイルのデタッチ(削除)処理
    • メールを「転送」や「新しいメッセージとして編集」する際、添付ファイルの一時ファイル名のデフォルト名(登録されていないContent-Typeの場合に拡張子が「.tmp」になる? 参考: viewtopic.php?f=3&t=16377
  • Thunderbirdの起動時に、「nsmail.tmp」、「nsmail-1.tmp」~ 「nsmail-9998.tmp」があれば削除されます。(9999以降は削除されない)

■「nscopy.tmp」
  • 送信済みトレイにメール控えをコピーする際に使われます。
  • Thunderbirdの起動時に、「nscopy.tmp」、「nscopy-1.tmp」~ 「nscopy-9998.tmp」があれば削除されます。(9999以降は削除されない)
投稿記事 Posted: 2023年6月09日(金) 02:56
  記事の件名:  Re: 一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
Re: メールの送信が出来なくて困っています・・」に記載されたエラーログを調べました。
コード:
mailnews.send:
Exception { name: "NS_ERROR_FILE_TOO_BIG", message: "Component returned failure code: 0x8052000f (NS_ERROR_FILE_TOO_BIG) [nsIFile.createUnique]", result: 2152857615, filename: "resource:///modules/MimeMessage.jsm", lineNumber: 72, columnNumber: 0, data: null, stack: "createMessageFile@resource:///modules/MimeMessage.jsm:72:10\ncreateAndSendMessage@resource:///modules/MessageSend.jsm:128:41\nCompleteGenericSendMessage@chrome://messenger/content/messengercompose/MsgComposeCommands.js:6108:23\nGenericSendMessage@chrome://messenger/content/messengercompose/MsgComposeCommands.js:6024:11\n", location: XPCWrappedNative_NoHelper }
MessageSend.jsm:130:27
上記のログによれば、「NS_ERROR_FILE_TOO_BIG」の例外エラーの発生元は「nsIFile.createUnique」で「MimeMessage.jsm」の72行目から呼ばれているようです。

該当箇所のソースコードを調べてみます。
https://searchfox.org/comm-esr102/sourc ... age.jsm#72
コード:
  async createMessageFile() {
    let topPart = this._initMimePart();
    let file = Services.dirsvc.get("TmpD", Ci.nsIFile);
    file.append("nsemail.eml");
    file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600);
どうやら、送信メール作成時に使われる一時ファイルは「nsemail.eml」だったようです。

さっそく「nsemail.eml」と「nsemail-1.eml ~ nsemail-9999.eml」をTempフォルダーに置いてメール送信を試してみますと、
「メッセージを送信できませんでした。」のエラーダイアログが表示され、エラーコンソールには下記が出力されました。
コード:
mailnews.send:
Exception { name: "NS_ERROR_FILE_TOO_BIG", message: "Component returned failure code: 0x8052000f (NS_ERROR_FILE_TOO_BIG) [nsIFile.createUnique]", result: 2152857615, filename: "resource:///modules/MimeMessage.jsm", lineNumber: 72, columnNumber: 0, data: null, stack: "createMessageFile@resource:///modules/MimeMessage.jsm:72:10\ncreateAndSendMessage@resource:///modules/MessageSend.jsm:128:41\nCompleteGenericSendMessage@chrome://messenger/content/messengercompose/MsgComposeCommands.js:6108:23\nGenericSendMessage@chrome://messenger/content/messengercompose/MsgComposeCommands.js:6024:11\n", location: XPCWrappedNative_NoHelper }
MessageSend.jsm:130:27

同じ状況の再現に成功しました。
しかも、「nsmail.tmp」ですと Thunderbirdの起動時に削除されるのですが、「nsemail.eml」は削除されないようです。

したがいまして、条件としては
  • Tempフォルダーに一時ファイル「nsemail.eml」の枝番ファイル「nsemail-9999.eml」が存在していた場合
ということで決まりかと思います。

ただし、一時ファイルが削除されずに枝番ファイルを作って9999まで増殖するに至る原因についてはまだ不明です。
投稿記事 Posted: 2023年6月06日(火) 01:52
  記事の件名:  一時ファイルの増殖で「NS_ERROR_FILE_TOO_BIG」エラーが発生する事例について  引用付きで返信する
このフォーラムで下記2件のトピックにて、Thunderbirdの送信処理中に「NS_ERROR_FILE_TOO_BIG」エラーが発生して送信が失敗するという事例が報告されています。

どちらの事例もWindowsのTempフォルダーに溜まっていた一時ファイルを掃除することによって不具合が解消されましたが、実際に何が起きていたのか、エラーが発生する状況に至った原因は何なのか等、詳細な部分が不明なままです。
このトピックでは情報の整理と類似事例の情報提供を募り、エラー発生に至る状況を検証し、防止策を考えていきたいと思っています。

1つ目のトピックの発生バージョンは「91.13.1」、2つ目のトピックは「102.11.0」になります。
しかし、私が行った簡易検証ではその2つのバージョンでの再現には成功しておらず、バージョン68以前でしか再現しませんでした。
用意すべき条件に不足があったものと思われますが、ひとまずバージョン68.12.1で再現させた際の再現手順と症状を以下に記載しておきます。

  1. Thunderbirdを起動します。
  2. 「%TEMP%」フォルダーに「nsmail.tmp、nsmail-1.tmp ~ nsmail-9999.tmp」を作成します。WSL2のLinux環境があれば下記のシェルスクリプトでできます。
    コード:
    #!/bin/bash
    touch nsmail.tmp
    i=1
    while [[ $i -le 9999 ]]
    do
      touch "nsmail-${i}.tmp"
      i=`expr $i + 1`
    done
  3. メールを作成して「送信」します。
  4. 「情報: メール情報を構築しています...」の段階で添付画像の「メッセージの送信エラーのダイアログが表示されます。
    添付ファイル:
    メッセージを送信できませんでした。.jpg
    メッセージを送信できませんでした。.jpg [ 59.47 KiB | 表示数: 6533 回 ]
  5. 「OK」をクリックしてエラーダイアログを閉じます。
  6. Thunderbirdのメイン画面にて、Ctrl+Shift+Jを入力してエラーコンソールを開いて確認すると、下記のような例外エラーが出力されています。
    コード:
    GenericSendMessage FAILED: [Exception... "Component returned failure code: 0x8052000f (NS_ERROR_FILE_TOO_BIG) [nsIMsgCompose.SendMsg]"  nsresult: "0x8052000f (NS_ERROR_FILE_TOO_BIG)"  location: "JS frame :: chrome://messenger/content/messengercompose/MsgComposeCommands.js :: GenericSendMessage :: line 3820"  data: no] MsgComposeCommands.js:3828

ThunderbirdのNS_ERROR_FILE_TOO_BIGエラーに関して下記のバグチケットがあります。
  • Bug 781478 Unable to send message, NS_ERROR_FILE_TOO_BIG error
  • Bug 673703 Thunderbird is limited to 10000 temp files, stops sending emails if nsmail-9999.tmp exists, and fails to open attachment if <attachment_filename>-9999.attachment_extension exists

同様の現象に遭遇された方、情報提供をお願いいたします。
投稿記事 Posted: 2023年6月04日(日) 20:02

All times are UTC + 9 hours


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