weblog of key_amb

主にIT関連の技術メモ

Cache::FastMmap::newの排他制御

前掲のようにCache::FastMmapを使い出して、しばらく経った頃に急にエラーが出ることがあった。

... failed: File exists at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Cache/FastMmap.pm line 629.%0ACompilation failed in require at /path/to/MyApp/API/Cache.pm ...
... Create of share file /tmp/sharefile-myapp-fastmmap failed: File exists at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Cache/FastMmap.pm line 629.%0ACompilation failed in require at /path/to/MyApp/API/Cache.pm ...
... Open of share file /tmp/sharefile-myapp-fastmmap failed: No such file or directory at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Cache/FastMmap.pm line 629.%0ACompilation failed in require at /path/to/MyApp/API/Cache.pm ...

みたいな感じで、色んなエラーが出た。
どうやら、Cache::FastMmap::newは共有ファイルを排他制御してくれないらしい。

そんなわけで、FastMmapオブジェクトの作成時にロックファイルを使って排他制御することにしました。

package MyApp::API::Cache;

use Cache::FastMmap;
use Fcntl qw(:flock);

my $fastMmap;

BEGIN {
	open(my $lck_handle, '>>', '/tmp/sharefile-myapp-fastmmap.lck');
	flock($lck_handle, LOCK_EX);

	$fastMmap = Cache::FastMmap->new(
		share_file  => '/tmp/sharefile-myapp-fastmmap',
	);
	close($lck_handle);
}

これで上記のエラーは回避できました。