gitweb/lib - Add clear() and size() methods to caching interface
authorJakub Narebski <jnareb@gmail.com>
Sun, 5 Dec 2010 23:01:10 +0000 (6 00:01 +0100)
committerJakub Narebski <jnareb@gmail.com>
Sun, 5 Dec 2010 23:01:10 +0000 (6 00:01 +0100)
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 <jnareb@gmail.com>
gitweb/lib/GitwebCache/SimpleFileCache.pm
t/t9503/test_cache_interface.pl

index 8d0a6d9..cd489f8 100644 (file)
@@ -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;
index 28a5c5e..031c895 100755 (executable)
@@ -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,