2014年8月27日水曜日

WriteFile等でタイムアウトエラー発生

WriteFile等、非同期I/Oで長くお待たせすると、エラーが出るようです。凡そ4秒と感じます。

「ファイルのコピー」
「予期しないエラーのため、ファイルをコピーできません。このエラーが再発する場合は、エラーコードを使用して、この問題についてのヘルプを検索してください。」
「エラー0x800705AA: システムリソースが不足しているため、要求されたサービスを完了できません。」

「再試行」「スキップ」「キャンセル」

「すべての項目にこれを実行する」


対策は、検討中です。

8 件のコメント:

  1. というのも、1MBの書き込み要求が来たとしても、実ファイルがネットワーク上に存在するならば、すぐには完了できない可能性が高い。そこで非同期、という選択なんでしょうけれども。。。エクスプローラのファイルコピーでこの挙動が見られます。

    返信削除
  2. DokanNet.DokanResetTimeout(millisecs, info); でタイムアウト時間を延長できるようです。

    参考:
    https://groups.google.com/forum/#!topic/dokan/ARppEKQWpbQ
    https://groups.google.com/forum/#!topic/dokan/a87cgpzt0nU

    返信削除
  3. 補足。エクスプローラのファイルコピーでは、1MBの非同期書き込みを5つ同時に走らせてきます。。。単純に、タイムアウト時間を5倍にして計算するべきか。

    返信削除
  4. Windows 7では、5つ同時にWriteFileが来る状況です。

    勿論、offsetとlengthは被らないように設定されてから、呼ばれるので、問題は無いのですが、、、

    要は処理する順番です。

    どうも lock (...) { } や Semaphore や ReaderWriterLock を用いますと、先に来た人が待たされる傾向が有ります。

    この現象がタイムアウトエラーを引き起こすきらいが有りますので、先入れ・先出しを確実に実行する為、独自にコーディングして回避しました。

    返信削除
  5. 「5つ同時」については、DokanOptions.ThreadCountが関係するようです。

    また、DokanNet.DokanResetTimeoutを呼んだとしても、エクスプローラが「60秒しか待たない」という状況設定が有るようで、苦慮しています。

    返信削除
  6. Process Monitor Sysinternalsで調査しました。

    SHELL32.dllのSHFileOperationExが呼び出されています。詳細な動きはその中で隠ぺいされており、不明です。1MBずつReadFileし、64KBずつWriteFileしているようです。

    返信削除
  7. ProcessMonitorとPEBrowseProfessionalの合わせ技で、_SHCopyStreamWithProgressAndErrorCauseItemから、関係が有りそうなレジストリの場所を取得しました。

    Software\Policies\Microsoft\Windows\System
    CopyFileChunkSize
    CopyFileOverlappedCount

    Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
    CopyBufferSize

    返信削除
  8. 結局、ThreadCount 5→2 で対応しました。

    返信削除