2010年4月29日

SMB2.0 on Windows7

 Windows7のSMBプロトコルヴァージョン2.0に関する仕様でハマッた。
 .NetのSystem.IO.File.Exist(<PATH>)メソッドを使用したプログラムがあるのだが、<PATH>を"\\IP.addres\share\file"の様に、共有ファイルを指定すると、一回目は問題ないのだが、連続して二回、三回と参照すると、二回目以降で10秒程度、Time Waitが発生する。(ファイルがあれば、なくなることが確認できるまでloopする仕様)

 Vista以降で変更されたSMB2.0プロトコルの仕様だそうで、クライアントキャッシュを参照するのだそうな。

http://blogs.msdn.com/winsdk/archive/2009/07/10/file-exists-access-getfileattributes-findfirstfile-findnextfile-stat-behavior-over-smb-2-0.aspx

 レジストリを変更する必要があるそうな。
以下のFileInfoCacheLifetime.regファイルを用意する。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
"FileInfoCacheLifetime"=dword:00000001

コマンドプロンプトから、以下のコマンドを実行すると、キャッシュ保存期間を1秒にできる。
DOS> REG import FileInfoCacheLifetime.reg

[SMB][Windows] : 2010年4月29日 20:07