CentOS7 において表題のような問題が発生してしまったので、解決方法を共有したいと思います。
解決方法
sambaサーバー側の /etc/samba/smb.conf の [global]
セクションに以下を加える
[global]
oplocks = No
解説
oplocks とは CIFS クライアントにおけるパフォーマンス向上を目的とした仕組みです。詳しい内容については MS の以下の記事を見てみて下さい。
うまく機能すれば有効なのかも知れませんが弊害も多いようです。デフォルトで有効になっているので、オフにする場合は前述の通りに設定します。
経緯とテスト
以下は samba サーバー上に存在する適当なテキストファイルを Windows 10 のメモ帳で開き、Ctrl+S
押下で保存した瞬間を inotify-tools で観察した結果です。
[develop@localhost 1]$ inotifywait -m /home/develop/test.txt |
> while read L;do echo `date`' '$L;done
Setting up watches.
Watches established.
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt OPEN
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt ACCESS
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt ATTRIB
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt MODIFY
2019年 10月 27日 日曜日 07:29:07 JST /home/develop/test.txt CLOSE_WRITE,CLOSE
2019年 10月 27日 日曜日 07:29:07 JST /home/develop/test.txt ATTRIB
^C
[develop@localhost 1]$
ファイルのオープン (OPEN) と書き込み (MODIFY) は Ctrl+S
の押下直後に発生していますが、クローズ (CLOSE_WRITE) は約11秒後になっています。このため保存直後に1度更新され、11秒後にさらに更新されます。「10秒ぐらいいいじゃん」という意見もあると思いますが、webpack の watch モードで2回トランスパイルされてしまったり、タイムスタンプ監視機能のあるエディタで「外部で更新されてます。再読み込みしますか?」等と聞かれてしまったりして何かと不便です。
そこでsmb.conf — Samba の設定ファイル等を読んでみた所、ズバリの情報はありませんでしたが oplocks
が怪しいのではないかと当たりをつけました。これをオフにして smb デーモンを再起動後、再び inotigy-tools でログを取りました。以下の通りです。
[develop@localhost 1]$ inotifywait -m /home/develop/test.txt |
> while read L;do echo `date`' '$L;done
Setting up watches.
Watches established.
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt OPEN
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt ACCESS
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt MODIFY
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt ATTRIB
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt CLOSE_WRITE,CLOSE
^C
[develop@localhost 1]$
書き込み (MODIFY) の直後にクローズ (CLOSE_WRITE) されるようになり、問題解決となりました。