Issue #11218 has been updated by Usaku NAKAMURA.

File share_delete.patch added

Usaku NAKAMURA wrote:
> ちなみに、rubyがrb_w32_(w)openをテキストモードで呼び出すのはかなりレアケースのはずです(ぼくにはすぐにはやり方が思いつかないレベル)。

あ、ごめんなさい、嘘でした。(バイナリモードでオープンしない限りテキストモードで呼んでた。あれー?)

お詫びの印にパッチつけときます。

----------------------------------------
Feature #11218: File.open FILE_SHARE_DELETE
https://bugs.ruby-lang.org/issues/11218#change-52751

* Author: Yui NARUSE
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
fluentdという、OSSのログコレクタがあるのですが、これにはin_tailプラグインというものがあります。
これは、ログファイルを監視して、ログがファイルに追記されたらその分を読み込んでJSONにして他に流します。

このログファイルはfluentdではない他の誰か、ApacheだったりRailsだったりします。
この手のログファイルを書いていく流儀はいくつかありますが、ご存じの通りRailsやApacheは基本的に特定のパスにひたすら追記し続け、
それでは肥大化しすぎるのでlogrotateなどと組み合わせて適宜rotateしていく運用が一般的でしょう。
つまり、ログファイルをrenameし、ApacheやRailsなどにsignalで再起動して新しいファイルに書くわけです。

ところで、Windowsは誰かが開いているファイルをrenameすることはできないので通常このようなことは出来ません。
やるにはファイルを開く際のCreateFileにFILE_SHARE_DELETEフラッグをつけてやる必要があります。
そんなことやってる人いるのかというご指摘もあるとは思いますが、やる人はやっているようです。
https://issues.apache.org/jira/browse/HADOOP-8564

さて、RubyのWindowsのopen(2)ラッパー、rb_w32_open/rb_w32_wopenはテキストモードの場合は_open/_wopenを使っており、
これはおいておくとして、バイナリモードの場合はCreateFileを使っているものの現状FILE_SHARE_DELETEは渡していないので、
なんらかの手段でFILE_SHARE_DELETEを付けられるようになりませんか。

---Files--------------------------------
share_delete.patch (2.9 KB)


-- 
https://bugs.ruby-lang.org/