From 10f94c3cf8530e4a10d4fe5825af90a2cb9f0e1a Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Mon, 6 Dec 2010 00:01:10 +0100 Subject: [PATCH] gitweb/lib - Add clear() and size() methods to caching interface Add ->size() method, which following Cache::Cache interface returns estimated total size of all entries in whole cache (in the namsepace assiciated with give cache instance). Note that ->get_size($key) returns size of a single entry! Add ->clear() method, which removes all entries from the namespace associated with given cache instance. For safety it requires namespace to be set to true value, which means that it cannot be empty; therefore default namespace is changed to 'gitweb'. The ->clear() method should be fairly safe, because it first renames directory (which should be atomic), and only then removes it (following code from CGI::Driver::File). Signed-off-by: Jakub Narebski --- gitweb/lib/GitwebCache/SimpleFileCache.pm | 48 ++++++++++++++++++++++++++++--- t/t9503/test_cache_interface.pl | 1 - 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/gitweb/lib/GitwebCache/SimpleFileCache.pm b/gitweb/lib/GitwebCache/SimpleFileCache.pm index 8d0a6d93c5..cd489f8e92 100644 --- a/gitweb/lib/GitwebCache/SimpleFileCache.pm +++ b/gitweb/lib/GitwebCache/SimpleFileCache.pm @@ -21,8 +21,9 @@ use strict; use warnings; use Carp; -use File::Path qw(mkpath); -use File::Temp qw(tempfile); +use File::Path qw(mkpath rmtree); +use File::Temp qw(tempfile mktemp); +use File::Find qw(find); use Digest::MD5 qw(md5_hex); # by default, the cache nests all entries on the filesystem single @@ -38,7 +39,7 @@ our $DEFAULT_CACHE_ROOT = "cache"; # by default we don't use cache namespace (empty namespace); # empty namespace does not allow for simple implementation of clear() method. # -our $DEFAULT_NAMESPACE = ''; +our $DEFAULT_NAMESPACE = "gitweb"; # ...................................................................... # constructor @@ -393,7 +394,7 @@ sub get_size { # ...................................................................... -# interface methods +# interface methods dealing with single item # Removing and expiring @@ -547,6 +548,45 @@ sub compute_fh { return ($fh, $filename); } +# ...................................................................... +# interface methods dealing with whole namespace + +# $cache->clear(); +# +# Remove all entries from the namespace. +# Namespace must be defined and not empty. +sub clear { + my $self = shift; + + return unless $self->get_namespace(); + + my $namespace_dir = $self->path_to_namespace(); + return if !-d $namespace_dir; + + my $renamed_dir = mktemp($namespace_dir . '.XXXX'); + rename($namespace_dir, $renamed_dir); + rmtree($renamed_dir); + die "Couldn't remove '$renamed_dir' directory" + if -d $renamed_dir; +} + +# $size = $cache->size(); +# +# Size of whole names (or whole cache if namespace empty) +sub size { + my $self = shift; + + my $namespace_dir = $self->path_to_namespace(); + return if !-d $namespace_dir; + + my $total_size = 0; + my $add_size = sub { $total_size += -s $File::Find::name }; + + File::Find::find({ wanted => $add_size, no_chdir => 1 }, $namespace_dir); + + return $total_size; +} + 1; __END__ # end of package GitwebCache::SimpleFileCache; diff --git a/t/t9503/test_cache_interface.pl b/t/t9503/test_cache_interface.pl index 28a5c5e764..031c895fb3 100755 --- a/t/t9503/test_cache_interface.pl +++ b/t/t9503/test_cache_interface.pl @@ -46,7 +46,6 @@ SKIP: { unless ($GitwebCache::SimpleFileCache::DEFAULT_CACHE_ROOT && $GitwebCache::SimpleFileCache::DEFAULT_CACHE_DEPTH); - is($cache->get_namespace(), '', "default namespace is ''"); cmp_ok($cache->get_root(), 'eq', $GitwebCache::SimpleFileCache::DEFAULT_CACHE_ROOT, "default cache root is '$GitwebCache::SimpleFileCache::DEFAULT_CACHE_ROOT'"); cmp_ok($cache->get_depth(), '==', $GitwebCache::SimpleFileCache::DEFAULT_CACHE_DEPTH, -- 2.11.4.GIT