Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windowsでのepubmaker #941

Closed
kmuto opened this issue Feb 12, 2018 · 6 comments
Closed

Windowsでのepubmaker #941

kmuto opened this issue Feb 12, 2018 · 6 comments

Comments

@kmuto
Copy link
Owner

kmuto commented Feb 12, 2018

Windowsでdebugなしの場合、

FileUtils.remove_entry_secure basetmpdir unless @config['debug']

のところでDirectory not emptyという奇妙なエラーが出る…。
screenshot from 2018-02-12 11-46-44

@hoshimado
Copy link

Twitterで書いた「発生のトリガー」は勘違いでした(※1)。すみません。
現時点では「トリガー不明」です。
発生する構成(config.yml)と、発生しない構成があって、その差分は不明です。

※1:Latexエラーがトリガーに最初は見えたのですが、Latexエラー無しになっても再現し続けました。

こちらの環境での再現状況を記載します。
なお発生する構成(config.yml)であっても、pdfmakerは正常終了しました。

環境は以下です。

  • Win7 (ビルド 7601) / Win10 (ビルド確認忘れ。エラー内容は同じ)
    • Win10側は、WSL【無し】。rubyはwindows nativeをインストール済み。
  • ruby 2.5.0p0 (2017-12-25 revision 61468) [x64-mingw32]
  • Latex導入済み。

発生時のエラー出力は以下です。

T:\>review epubmaker config.yml
Traceback (most recent call last):
        11: from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/review-2.4.0/bin/review-epubmaker:43:in `<main>'
        10: from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/review-2.4.0/lib/review/epubmaker.rb:138:in `produce'
         9: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:625:in `remove_entry_secure'
         8: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:689:in `remove_entry'
         7: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1387:in `postorder_traverse'
         6: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1387:in `ensure in postorder_traverse'
         5: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:691:in `block in remove_entry'
         4: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1330:in `remove'
         3: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1337:in `remove_dir1'
         2: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1352:in `platform_support'
         1: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1338:in `block in remove_dir1'
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1338:in `rmdir': Directory not empty @ dir_s_rmdir - C:/Temp/ほげほげ (Err
no::ENOTEMPTY)

上記の「Directory not empty」エラーが出た場合でも、ファイル「ほげほげ.epub」は
正常に出力できています(少なくとも、Win10では開ける。Win7は環境未導入)。

エラーしている「C:/Temp/ほげほげ (Errno::ENOTEMPTY)」は一時ファイル置き場のフォルダであって、
「epub出力後の後始末(これの削除)に失敗している」という現象に見えます。
「debug指定(一時ファイルを残す)」した場合は、この「削除処理」がスキップされるので、エラーにならないようです。

fileutils.rb でエラーしている、ので
4: from C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1330:in remove'`
辺りに従って、fileutils.rb:1327Lの直後に、puts path()を入れて実行して見ました。

C:/Temp/d20180217-ふがふが/META-INF/container.xml
 (中略)
C:/Temp/ほげほげ/00-overview.xhtml
C:/Temp/ほげほげ/10-ぴよ.xhtml
C:/Temp/ほげほげ/20-ぴよ.xhtml
C:/Temp/ほげほげ/30-ぴよ.xhtml
C:/Temp/ほげほげ/40-ぴよ.xhtml
C:/Temp/ほげほげ
Traceback (most recent call last):
        11: from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/review-2.4.0/bin/review-epubmaker:43:in `<main>'

上記のように出力されました。
「C:/Temp/ほげほげ」配下には、上記にリストアップされたファイルの他にも

  • 50-ぴよ.xhtml
  • preface.re
     ・・・
    等のファイルがあります。そちらへも削除コマンドが走るべきなのが、何故か止まっているため、
    ファイルが残っています(00~40は消えてた)。
    そのため、「空ではないフォルダは削除できない」でエラーになっているように見えます。

L1327::def remove は、L688::def remove_entry(path, force = false)での
ループから呼び出されていると思いますが、なぜこのループが途中で止まるのか、
が不明です。
(Rubyスクリプトの経験ないため、ループの流れが読めず。仕様理解には手が回らず)

以上、現時点までに確認できたことになります。
(いったん時間切れ)

@kmuto
Copy link
Owner Author

kmuto commented Feb 18, 2018

review-epubmaker config.ymlを実行すると、3回に1回くらいは成功するという現象が発生しました。
Ruby側かWindowsのAPIでのエラーっぽいかんじですね。

たぶんsafeをやめちゃえばいいので、Windowsではそう対処しましょうか…。

@kmuto
Copy link
Owner Author

kmuto commented Feb 18, 2018

rm_rfでもダメだな、なんだこれわ…

@znz
Copy link
Contributor

znz commented Feb 20, 2018

Windows だと開いているファイルは削除できませんが、閉じ忘れているファイルがあって、GC の実行具合によっては GC で閉じられてうまくいくこともある、という可能性はないでしょうか?
(削除処理の直前に GC.start を入れて試せば確認できる?)

@kmuto
Copy link
Owner Author

kmuto commented Feb 20, 2018

@znz さん、ありがとうございます、コードを戻し、GC.start を入れてみたら10回ほどやってみて問題が生じませんでした。
しかしこれを明示的に入れるというのもなんか気持ちが悪いような……

rm_rfで問題になっていたのはa.xhtmlだったので、ロックしているとすればREXMLのDocument.parse_stream(File.new(path)) ですかね…。

@kmuto
Copy link
Owner Author

kmuto commented Feb 20, 2018

Windowsのopenfilesで追っていったところ、やはりepubmaker.rbのwrite_info_body()のDocument.parse_stream(File.new(path), ...)で開いたpathファイルが閉じないままになっているようでした。

File.new(path)をやめてIOオブジェクト変数にいったん格納し、メソッド末尾でcloseすることで正常に閉じることができたようです。Unix側にも影響がないのでこれで対処したいと思います。

ありがとうございました!

@kmuto kmuto closed this as completed in 15a0119 Feb 20, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants