Cache-AgainstFile
view release on metacpan or search on metacpan
lib/Cache/AgainstFile/CacheModule.pm view on Meta::CPAN
($last_modified, $data) = @$record;
unless($self->{options}->{NoStat})
{
my $grace = $self->{options}->{Grace} || 0;
my $last_checked = $self->{'stat'}{$filename} || 0;
#Are we within the grace period since our last stat?
unless($grace > time - $last_checked)
{
TRACE("stat: $filename");
$data = undef if((stat($filename))[9] > $last_modified); #stat and maybe mark as stale
$self->{'stat'}{$filename} = time;
}
}
}
unless(defined $data)
{
TRACE("stale: $filename");
$data = $self->{loader}->($filename, @opts);
$last_modified = (stat($filename))[9];
$self->_set($filename, [$last_modified, $data]);
}
else
{
TRACE("not stale: $filename");
}
return $data;
}
#Forward all other methods to backend
lib/Cache/AgainstFile/Memory.pm view on Meta::CPAN
my $source_mtime;
unless ($self->{options}->{NoStat} && !$stale)
{
#Are we within the grace period since our last stat?
my $grace = $self->{options}->{Grace} || 0;
my $last_checked = $self->{'stat'}{$filename} || 0;
unless($grace > time - $last_checked)
{
TRACE("stat: $filename");
check_safe($filename, "r") if(HAVE_FILE_POLICY);
$source_mtime = (stat($filename))[9];
my $last_modified = $self->{modified}{$filename};
$stale |= (!defined $source_mtime) || (!defined $last_modified) || ($source_mtime ne $last_modified);
$self->{'stat'}{$filename} = time;
}
}
my $data;
if($stale)
{
TRACE("stale memory: $filename");
$data = $self->{loader}->($filename, @opts);
lib/Cache/AgainstFile/Memory.pm view on Meta::CPAN
sub _accessed {
my($self) = @_;
my %atimes = %{$self->{accessed}};
return \%atimes;
}
sub _stale {
my($self) = @_;
my $modified = $self->{modified};
return grep {
my $src = (stat($_))[9];
(!defined $src) || ($src ne $modified->{$_})
} keys %$modified;
}
#
# Log::Trace stubs
#
sub TRACE {}
sub DUMP {}
lib/Cache/AgainstFile/Storable.pm view on Meta::CPAN
my $cache_fh = new FileHandle;
check_safe($cache_filename,"r") if(HAVE_FILE_POLICY);
unless ($cache_fh->open($cache_filename)) {
undef $cache_fh;
$stale = 1;
}
# Compare file mtimes to check staleness
my $file_mtime;
unless ($self->{options}->{NoStat} && !$stale) {
$file_mtime = (stat($filename))[9];
my $cache_mtime = ($cache_fh->stat)[9] if $cache_fh;
$stale = (!defined $file_mtime) || (!defined $cache_mtime) || ($file_mtime != $cache_mtime);
}
TRACE("Cache " . ($stale?"is":"is not") . " stale");
#Read from cache
my $data;
if (!$stale) {
$data = eval { $self->{read}->($cache_filename, $cache_fh) };
if ($@) {
warn "Storable couldn't retrieve $cache_filename: $@";
$stale = 1;
}
}
$cache_fh->close if $cache_fh;
#Write to cache
if ($stale) {
TRACE("writing cache");
$data = $self->{loader}->($filename, @opts);
$file_mtime = (stat($filename))[9] unless(defined $file_mtime); #Need mtime now
$self->{write}->($cache_filename, $data, $file_mtime);
}
return $data;
}
sub count {
my ($self) = shift;
my $files_in_cache = $self->_cache_files;
return scalar @$files_in_cache;
lib/Cache/AgainstFile/Storable.pm view on Meta::CPAN
}
}
sub _accessed {
my($self) = @_;
my $cache_dir = $self->{options}{CacheDir};
my $files_in_cache = $self->_cache_files;
my %accessed = map
{
my $cache_file = catfile($cache_dir, $_);
$self->_cache2filename($_) => (stat($cache_file))[8]
}
@$files_in_cache;
return \%accessed;
}
sub _stale {
my($self) = @_;
my $cache_dir = $self->{options}{CacheDir};
my $files_in_cache = $self->_cache_files;
my @out =
t/CacheAgainstFile-Memory.t view on Meta::CPAN
touch($filename);
############################################################################
# Memory caching
############################################################################
my $mem_cache = new Cache::AgainstFile($callback, {Method => 'Memory'});
ASSERT($mem_cache->{method} eq 'Memory', "Memory backend");
test_basics($mem_cache, $filename, undef, $size_not_available);
$mem_cache = new Cache::AgainstFile($callback, {Method => 'Memory', 'NoStat' => 1});
test_nostat($mem_cache, $filename);
$mem_cache = new Cache::AgainstFile($callback, {Method => 'Memory', 'MaxItems' => 3});
test_max_items($mem_cache, $dir, 3);
$mem_cache = new Cache::AgainstFile($callback, {Method => 'Cache::AgainstFile::Memory', 'MaxATime' => (2.5 * SLEEP_INT)}); #fq backend
test_old_items($mem_cache, $dir, 5, 3);
############################################################################
# Clean up
############################################################################
END {
TRACE("Cleaning up $dir");
t/CacheAgainstFile-Storable.t view on Meta::CPAN
goto trans if($opt_d);
############################################################################
### Disk caching
############################################################################
my $disk_cache = new Cache::AgainstFile($callback, {Method => 'Storable', 'CacheDir' => $cache_dir});
ASSERT($disk_cache->{method} eq 'Storable', "Storable caching");
test_basics($disk_cache, $filename);
$disk_cache = new Cache::AgainstFile($callback, {Method => 'Storable', 'CacheDir' => $cache_dir."/", 'NoStat' => 1, Locking => 'Flock'});
test_nostat($disk_cache, $filename);
$disk_cache = new Cache::AgainstFile($callback, {Method => 'Storable', 'CacheDir' => $cache_dir, 'MaxItems' => 2, Locking => 'AtomicWrite'});
test_max_items($disk_cache, $dir, 2);
#delete the cache dir so we have to create it
rmtree($cache_dir);
$disk_cache = new Cache::AgainstFile($callback, {Method => 'Cache::AgainstFile::Storable', 'CacheDir' => $cache_dir, 'MaxATime' => (2.5 * SLEEP_INT)}); #fq backend
rmtree($cache_dir); #delete underneath cache
ASSERT(DIED(sub {
$disk_cache->count()
}) && $@ =~ /unable to open directory/, "failed dir read raises exception");
t/CacheAgainstFile.lib view on Meta::CPAN
#Touch the file
sleep( SLEEP_INT );
touch( $filename );
$callcount = 0;
ASSERT($cache->get($filename) eq "filename:$filename" && $callcount == 1, "$method: touch => stat & cache miss (call count $callcount)");
#Sneak a sourcefile change in through vulnerable window
sleep (SLEEP_INT);
$callcount = 0;
touch ($filename);
$m_before = (stat($filename))[9];
$loaddelay = 5;
ASSERT($cache->get($filename) eq "filename:$filename" && $callcount == 1, "$method: touch => stat & cache miss (call count $callcount)");
# "While we were calculating", the sourcefile was modified
$m_before++;
(utime $m_before, $m_before, $filename) or die "couldn't posttouch $filename: $!";
$callcount = 0;
$cache->get($filename);
ASSERT($callcount == 1, "window-of-vulnerability check");
$loaddelay = 0;
( run in 0.611 second using v1.01-cache-2.11-cpan-49f99fa48dc )