「java.io.IOException: これ以上ファイルがありません。」が発生します。

 
Windows Server の共有フォルダをストレージに設定している場合、ストレージにアクセスすると、希に以下のエラーが出力される場合があります。

java.io.IOException: これ以上ファイルがありません。
英語表記の場合はエラーメッセージは「There are no more files」です。

特に、Resin起動時などストレージに対して大量のアクセスを行った場合に発生頻度が高くなることを確認しています。
また、通常のストレージアクセスにおいても発生するとの報告もあります。

関連FAQ
 https://product.intra-mart.support/hc/ja/articles/360051355694
 (このFAQはResin起動時のみに関するFAQです。)

【原因】
 OS(Windows Server) から「ERROR_NO_MORE_FILES」のエラー ID が返却された際に、JDK で例外として処理されるためです。

こちらは JDK の以下のバグに起因している可能性が考えられます。
https://bugs.openjdk.java.net/browse/JDK-8234363 (英語)

2023年6月現在、このエラーが発生する原因については、OS側から発生していることもあり、根本的な原因が分かっておりません。

調査を進めたところ、以下 Microsoft社のサイトより、この現象に関連しそうな情報がありました。

 https://learn.microsoft.com/ja-jp/windows-server/administration/performance-tuning/role/file-server/

各種設定の中から、以下のように設定を変更した場合、事象が抑制されることを確認しています。

HKLM/System/CurrentControlSet/Services/LanmanWorkstation/Parameters/DirectoryCacheLifetime

DirectoryCacheLifetimeを0に設定

ただし、根本的な原因が分かっていないため、以下のような懸念点があります。

・100% 抑制できているかの確認ができていません。
・Windows Server の共有フォルダのキャッシュに関する設定であるため、ストレージ操作が遅延する可能性があります。

上記設定は、Windows レジストリの変更ですので、お客様の責任において設定の上、十分な検証をお願いします。

【参考情報】
この事象は、Windows Server の共有フォルダを利用する場合に発生するものであり、Linux環境においてはこの事象は確認されていません。

【対応方法】
上記JDKの問題に起因してストレージへのアクセスに失敗する事象が発生したときに、リトライを行うことで問題を回避できるようにします。

下記のシステムプロパティでリトライ回数を設定可能です。(デフォルトは 3 回となっております。)
jp.co.intra_mart.system.service.client.file.StorageUtil.retry_count
例) -Djp.co.intra_mart.system.service.client.file.StorageUtil.retry_count=5

※「2023 Autumn」の下記要件で対応しました。
 https://issue.intra-mart.jp/issues/35789

この対応方法はOS側から発生している場合でも有効な対応方法となります。

 -- 対象 -------------------------------------------------------------------------
iAP/Accel Platform/2023 Spring 以前
 ---------------------------------------------------------------------------------

FAQID:1278
この記事は役に立ちましたか?
2人中2人がこの記事が役に立ったと言っています
Powered by Zendesk