From 5fecab1d06495bd848bf203fa10c2b98e63cfd22 Mon Sep 17 00:00:00 2001 From: dormando Date: Thu, 1 Dec 2011 18:39:37 -0800 Subject: [PATCH] provide a server setting cache via monitor worker --- lib/MogileFS/Config.pm | 14 ++++++++++++-- lib/MogileFS/Store.pm | 16 ---------------- lib/MogileFS/Util.pm | 7 +++++++ lib/MogileFS/Worker/Monitor.pm | 14 ++++++++++++-- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lib/MogileFS/Config.pm b/lib/MogileFS/Config.pm index 8f215c4..3b9c394 100644 --- a/lib/MogileFS/Config.pm +++ b/lib/MogileFS/Config.pm @@ -21,6 +21,7 @@ use constant REBAL_QUEUE => 2; use constant DEVICE_SUMMARY_CACHE_TIMEOUT => 15; my %conf; +my %server_settings; sub set_config { shift if @_ == 3; my ($k, $v) = @_; @@ -269,9 +270,18 @@ sub server_setting { return Mgd::get_store()->server_setting($key); } +sub cache_server_setting { + my ($class, $key, $val) = @_; + if (! defined $val) { + delete $server_settings{$key} + if exists $server_settings{$key}; + } + $server_settings{$key} = $val; +} + sub server_setting_cached { - my ($class, $key, $timeout) = @_; - return Mgd::get_store()->server_setting_cached($key, $timeout); + my ($class, $key) = @_; + return $server_settings{$key}; } my $memc; diff --git a/lib/MogileFS/Store.pm b/lib/MogileFS/Store.pm index 9c44909..7a0fe60 100644 --- a/lib/MogileFS/Store.pm +++ b/lib/MogileFS/Store.pm @@ -54,7 +54,6 @@ sub new_from_dsn_user_pass { recheck_req_gen => 0, # incremented generation, of recheck of dbh being requested recheck_done_gen => 0, # once recheck is done, copy of what the request generation was handles_left => 0, # amount of times this handle can still be verified - server_setting_cache => {}, # value-agnostic db setting cache. }, $subclass; $self->init; return $self; @@ -875,21 +874,6 @@ sub server_setting { undef, $key); } -# generic server setting cache. -# note that you can call the same server setting with different timeouts, but -# the timeout specified at the time of ... timeout, wins. -sub server_setting_cached { - my ($self, $key, $timeout) = @_; - $self->{server_setting_cache}->{$key} ||= {val => '', refresh => 0}; - my $cache = $self->{server_setting_cache}->{$key}; - my $now = time(); - if ($now > $cache->{refresh}) { - $cache->{val} = $self->server_setting($key); - $cache->{refresh} = $now + $timeout; - } - return $cache->{val}; -} - sub server_settings { my ($self) = @_; my $ret = {}; diff --git a/lib/MogileFS/Util.pm b/lib/MogileFS/Util.pm index c164a7d..882d7e1 100644 --- a/lib/MogileFS/Util.pm +++ b/lib/MogileFS/Util.pm @@ -35,6 +35,13 @@ sub apply_state_events { my $type = delete $args->{ev_type}; my $id = delete $args->{ev_id}; + # This special case feels gross, but that's what it is. + if ($type eq 'srvset') { + my $val = $mode eq 'set' ? $args->{value} : undef; + MogileFS::Config->cache_server_setting($args->{field}, $val); + next; + } + my $old = $factories{$type}->get_by_id($id); if ($mode eq 'setstate') { # Host/Device only. diff --git a/lib/MogileFS/Worker/Monitor.pm b/lib/MogileFS/Worker/Monitor.pm index 9280380..924974d 100644 --- a/lib/MogileFS/Worker/Monitor.pm +++ b/lib/MogileFS/Worker/Monitor.pm @@ -215,7 +215,9 @@ sub diff_data { my $id = $type eq 'domain' ? $item->{dmid} : $type eq 'class' ? $item->{dmid} . '-' . $item->{classid} : $type eq 'host' ? $item->{hostid} - : $type eq 'device' ? $item->{devid} : die "Unknown type"; + : $type eq 'device' ? $item->{devid} + : $type eq 'srvset' ? $item->{field} + : die "Unknown type"; my $old = delete $p_data->{$id}; # Special case: for devices, we don't care if mb_asof changes. # FIXME: Change the grab routine (or filter there?). @@ -262,10 +264,18 @@ sub grab_all_data { while (my ($name, $id) = each %dom) { push(@fixed_dom, { namespace => $name, dmid => $id }); } + + my $set = $sto->server_settings; + my @fixed_set = (); + while (my ($field, $value) = each %$set) { + push(@fixed_set, { field => $field, value => $value }); + } + my %ret = ( domain => \@fixed_dom, class => [$sto->get_all_classes], host => [$sto->get_all_hosts], - device => [$sto->get_all_devices], ); + device => [$sto->get_all_devices], + srvset => \@fixed_set, ); return \%ret; } -- 2.11.4.GIT