From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: John 'Warthog9' Hawley <warthog9@eaglescrag.net>,
John 'Warthog9' Hawley <warthog9@kernel.org>,
Jakub Narebski <jnareb@gmail.com>
Subject: [RFC PATCH 06/10] gitweb/cache.pm - Adaptive cache expiration time (WIP)
Date: Sat, 23 Jan 2010 01:27:29 +0100 [thread overview]
Message-ID: <1021d8b597baf908f9770e36dddde87e9fbf1a0c.1264198194.git.jnareb@gmail.com> (raw)
In-Reply-To: <1263432185-21334-10-git-send-email-warthog9@eaglescrag.net>
In-Reply-To: <cover.1264198194.git.jnareb@gmail.com>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This patch, as you can see, lack proper commit message: it is work in
progress.
As it is quick'n'dirty proof of concept patch, it lacks variables in
gitweb.perl that can be used to control cache behaviour. In original
patch in J.H. those were the following variables: $minCacheTime,
$maxCacheTime.
In the final version we should probably leave $check_load undefined,
or set it to 'sub { return 0; }' instead of requiring that there is
get_loadavg() subroutine in main namespace (see t9503 test change).
It would be alos good idea to leave ->set_expires_in() subroutine
which would set min and max range so that adaptive cache lifetime is
effectively disabled.
gitweb/cache.pm | 82 ++++++++++++++++++++++++++++++++++----
t/t9503/test_cache_interface.pl | 8 +++-
2 files changed, 80 insertions(+), 10 deletions(-)
diff --git a/gitweb/cache.pm b/gitweb/cache.pm
index 3a33158..9692e8d 100644
--- a/gitweb/cache.pm
+++ b/gitweb/cache.pm
@@ -61,24 +61,36 @@ sub new {
my $self = {};
$self = bless($self, $class);
- my ($root, $depth, $ns, $expires_in);
+ my ($root, $depth, $ns);
+ my ($expires_min, $expires_max, $increase_factor, $check_load);
if (defined $p_options_hash_ref) {
$root = $p_options_hash_ref->{'cache_root'};
$depth = $p_options_hash_ref->{'cache_depth'};
$ns = $p_options_hash_ref->{'namespace'};
- $expires_in =
+ $expires_min =
+ $p_options_hash_ref->{'expires_min'} ||
$p_options_hash_ref->{'default_expires_in'} ||
$p_options_hash_ref->{'expires_in'};
+ $expires_max =
+ $p_options_hash_ref->{'expires_max'};
+ $increase_factor = $p_options_hash_ref->{'expires_factor'};
+ $check_load = $p_options_hash_ref->{'check_load'};
}
$root = $DEFAULT_CACHE_ROOT unless defined($root);
$depth = $DEFAULT_CACHE_DEPTH unless defined($depth);
$ns = '' unless defined($ns);
- $expires_in = -1 unless defined($expires_in); # <0 means never
+ $expires_min = 20 unless defined($expires_min);
+ $expires_max = 1200 unless defined($expires_max);
+ $increase_factor = 60 unless defined($increase_factor);
+ $check_load = \&main::get_loadavg unless defined($check_load);
$self->set_root($root);
$self->set_depth($depth);
$self->set_namespace($ns);
- $self->set_expires_in($expires_in);
+ $self->set_expires_min($expires_min);
+ $self->set_expires_max($expires_max);
+ $self->set_increase_factor($increase_factor);
+ $self->set_check_load($check_load);
return $self;
}
@@ -124,19 +136,71 @@ sub set_namespace {
$self->{'_Namespace'} = $namespace;
}
-sub get_expires_in {
+
+sub get_expires_min {
my ($self) = @_;
- return $self->{'_Expires_In'};
+ return $self->{'_Expires_Min'};
+}
+
+sub set_expires_min {
+ my ($self, $expires_min) = @_;
+
+ $self->{'_Expires_Min'} = $expires_min;
}
+sub get_expires_max {
+ my ($self) = @_;
+
+ return $self->{'_Expires_Max'};
+}
+
+sub set_expires_max {
+ my ($self, $expires_max) = @_;
+
+ $self->{'_Expires_Max'} = $expires_max;
+}
+
+sub get_increase_factor {
+ my ($self) = @_;
+
+ return $self->{'_Increase_Factor'};
+}
-sub set_expires_in {
- my ($self, $expires_in) = @_;
+sub set_increase_factor {
+ my ($self, $increase_factor) = @_;
- $self->{'_Expires_In'} = $expires_in;
+ $self->{'_Increase_Factor'} = $increase_factor;
}
+sub get_check_load {
+ my ($self) = @_;
+
+ return $self->{'_Check_Load'};
+}
+
+sub set_check_load {
+ my ($self, $sub) = @_;
+
+ $self->{'_Check_Load'} = $sub;
+}
+
+# ......................................................................
+
+sub get_expires_in {
+ my ($self) = @_;
+ my $expires_in =
+ #$self->get_expires_min() +
+ $self->get_increase_factor() * $self->get_check_load()->();
+
+ if ($expires_in < $self->get_expires_min()) {
+ return $self->get_expires_min();
+ } elsif ($expires_in > $self->get_expires_max()) {
+ return $self->get_expires_max();
+ }
+
+ return $expires_in;
+}
# ----------------------------------------------------------------------
# (private) utility functions and methods
diff --git a/t/t9503/test_cache_interface.pl b/t/t9503/test_cache_interface.pl
index 3644ca8..0870b87 100755
--- a/t/t9503/test_cache_interface.pl
+++ b/t/t9503/test_cache_interface.pl
@@ -6,6 +6,11 @@ use strict;
use Test::More;
+# mockup
+sub get_loadavg {
+ return 0.0;
+}
+
# test source version; there is no installation target for gitweb
my $cache_pm = "$ENV{TEST_DIRECTORY}/../gitweb/cache.pm";
@@ -77,7 +82,8 @@ cmp_ok($call_count, '==', 1, 'get_value() is called once');
# Test cache expiration for 'expire now'
#
-$cache->set_expires_in(0);
+$cache->set_expires_min(0);
+$cache->set_expires_max(0);
is($cache->get_expires_in(), 0, '"expires in" is set to now (0)');
$cache->set($key, $value);
ok(!defined($cache->get($key)), 'cache is expired');
--
1.6.6.1
next prev parent reply other threads:[~2010-01-23 0:28 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-14 1:22 [PATCH 0/9] Gitweb caching v5 John 'Warthog9' Hawley
2010-01-14 1:22 ` [PATCH 1/9] gitweb: Load checking John 'Warthog9' Hawley
2010-01-14 1:22 ` [PATCH 2/9] gitweb: change die_error to take "extra" argument for extended die information John 'Warthog9' Hawley
2010-01-14 1:22 ` [PATCH 3/9] gitweb: Add option to force version match John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 4/9] gitweb: Makefile improvements John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 5/9] gitweb: add a get function to compliment print_local_time John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 6/9] gitweb: add a get function to compliment print_sort_th John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 7/9] gitweb: cleanup error message produced by undefined $site_header John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 8/9] gitweb: Convert output to using indirect file handle John 'Warthog9' Hawley
2010-01-14 1:23 ` [PATCH 9/9] gitweb: File based caching layer (from git.kernel.org) John 'Warthog9' Hawley
2010-01-16 2:48 ` Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 00/10] gitweb: Simple file based output caching Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 02/10] gitweb: href(..., -path_info => 0|1) Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 03/10] gitweb/cache.pm - Very simple file based caching Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 04/10] gitweb/cache.pm - Stat-based cache expiration Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 05/10] gitweb: Use Cache::Cache compatibile (get, set) output caching (WIP) Jakub Narebski
2010-01-23 0:27 ` Jakub Narebski [this message]
2010-01-23 0:27 ` [RFC PATCH 07/10] gitweb: Use CHI compatibile (compute method) " Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 08/10] gitweb/cache.pm - Use locking to avoid 'stampeding herd' problem (WIP) Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 09/10] gitweb/cache.pm - Serve stale data when waiting for filling cache (WIP) Jakub Narebski
2010-01-23 0:27 ` [RFC PATCH 10/10] gitweb: Show appropriate "Generating..." page when regenerating " Jakub Narebski
2010-01-24 22:24 ` Petr Baudis
2010-01-25 0:03 ` Jakub Narebski
2010-01-25 1:17 ` Jakub Narebski
2010-01-25 11:46 ` Jakub Narebski
2010-01-25 13:02 ` Petr Baudis
2010-01-25 13:48 ` Jakub Narebski
2010-01-25 13:56 ` Petr Baudis
2010-01-25 20:32 ` J.H.
2010-01-26 1:49 ` Jakub Narebski
2010-01-28 17:39 ` Petr Baudis
2010-01-31 11:58 ` Jakub Narebski
2010-01-25 20:58 ` Jakub Narebski
2010-01-25 20:41 ` J.H.
2010-01-26 2:30 ` Jakub Narebski
2010-01-23 19:55 ` [RFC PATCH 00/10] gitweb: Simple file based output caching J.H.
2010-01-24 13:54 ` [RFC PATCH 11/10] gitweb: Ajax-y "Generating..." page when regenerating cache (WIP) Jakub Narebski
2010-02-06 0:51 ` [RFC PATCH 00/10] gitweb: Simple file based output caching J.H.
2010-02-06 23:56 ` Jakub Narebski
2010-02-07 12:35 ` Jakub Narebski
[not found] ` <0dd15cb3f18e2a26fc834fd3b071e6d3ecc00557.1264198194.git.jnareb@gmail.com>
2010-01-23 0:48 ` [RFC PATCH 01/10] gitweb: Print to explicit filehandle (preparing for caching) Jakub Narebski
2010-02-07 21:32 ` Jakub Narebski
2010-01-16 0:43 ` [PATCH 8/9] gitweb: Convert output to using indirect file handle Jakub Narebski
2010-01-16 0:58 ` Junio C Hamano
2010-01-16 1:14 ` Jakub Narebski
2010-01-16 1:41 ` Junio C Hamano
2010-01-24 22:14 ` Petr Baudis
2010-01-25 1:47 ` Jakub Narebski
2010-01-25 20:48 ` J.H.
2010-01-25 21:48 ` Jakub Narebski
2010-01-15 23:49 ` [PATCH 7/9] gitweb: cleanup error message produced by undefined $site_header Jakub Narebski
2010-01-23 11:13 ` [PATCH 5/9] gitweb: add a get function to compliment print_local_time Jakub Narebski
2010-01-15 23:36 ` [PATCH 3/9] gitweb: Add option to force version match Jakub Narebski
2010-01-24 21:59 ` Petr Baudis
2010-01-24 23:17 ` Jakub Narebski
2010-01-15 22:40 ` [PATCH 2/9] gitweb: change die_error to take "extra" argument for extended die information Jakub Narebski
2010-01-15 22:30 ` [PATCH 1/9] gitweb: Load checking Jakub Narebski
2010-01-15 1:40 ` [PATCH 0/9] Gitweb caching v5 Jakub Narebski
2010-01-15 4:29 ` J.H.
2010-01-15 10:28 ` Jakub Narebski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1021d8b597baf908f9770e36dddde87e9fbf1a0c.1264198194.git.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
--cc=warthog9@eaglescrag.net \
--cc=warthog9@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).