From ae02d1178c6859f7a0a5e4a22c685de5f0477568 Mon Sep 17 00:00:00 2001 From: Jason Terry Date: Wed, 11 Feb 2015 15:32:08 -0700 Subject: [PATCH] Cache the FS::Conf info per page load, for performance. Conflicts: FS/FS/Conf.pm --- FS/FS/Conf.pm | 18 ++++++++++++++---- FS/FS/Daemon/Preforking.pm | 2 +- FS/FS/UID.pm | 3 +++ FS/bin/freeside-queued | 19 ++++++++++--------- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index c4e5af4e0..855c9f421 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1,7 +1,7 @@ package FS::Conf; -use vars qw($base_dir @config_items @base_items @card_types $DEBUG); use strict; +use vars qw($base_dir @config_items @base_items @card_types $DEBUG $conf_cache); use Carp; use IO::File; use File::Basename; @@ -134,9 +134,13 @@ sub _config { foreach my $a (@a) { $hashref->{agentnum} = $a; foreach my $l (@l) { - $hashref->{locale} = $l; - $cv = FS::Record::qsearchs('conf', $hashref); - return $cv if $cv; + my $key = join(':',$name, $a, $l); + if (! exists $conf_cache->{$key}){ + $hashref->{locale} = $l; + # $conf_cache is reset in FS::UID during myconnect, so the cache is reset per connection + $conf_cache->{$key} = FS::Record::qsearchs('conf', $hashref); + } + return $conf_cache->{$key} if $conf_cache->{$key}; } } return undef; @@ -362,6 +366,12 @@ sub set { $error = $new->insert; } + if (! $error) { + # clean the object cache + my $key = join(':',$name, $agentnum, $self->{locale}); + $conf_cache->{ $key } = $new; + } + die "error setting configuration value: $error \n" if $error; diff --git a/FS/FS/Daemon/Preforking.pm b/FS/FS/Daemon/Preforking.pm index f3a39a6ed..4c382eb76 100644 --- a/FS/FS/Daemon/Preforking.pm +++ b/FS/FS/Daemon/Preforking.pm @@ -46,7 +46,7 @@ use warnings; use strict; use constant DEBUG => 0; # Enable much runtime information. -use constant MAX_PROCESSES => 10; # Total server process count. +use constant MAX_PROCESSES => 4; # Total server process count. XXX conf to increase per-different daemon for busy sites using this (currently the only things using this are freeside-xmlrpcd and freeside-selfservice-xmlrpcd) #use constant TESTING_CHURN => 0; # Randomly test process respawning. use vars qw( @EXPORT_OK $FREESIDE_LOG $SERVER_PORT $user $handle_request ); diff --git a/FS/FS/UID.pm b/FS/FS/UID.pm index f41735d4e..453579915 100644 --- a/FS/FS/UID.pm +++ b/FS/FS/UID.pm @@ -176,6 +176,9 @@ sub myconnect { ) or die "DBI->connect error: $DBI::errstr\n"; + require FS::Conf; + $FS::Conf::conf_cache = undef; + if ( $schema ) { use DBIx::DBSchema::_util qw(_load_driver ); #quelle hack my $driver = _load_driver($handle); diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 7c4cf1b64..4786132c6 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -38,15 +38,16 @@ drop_root(); $ENV{HOME} = (getpwuid($>))[7]; #for ssh warn "connecting to database\n" if $DEBUG; -$@ = 'not connected'; -while ( $@ ) { - eval { adminsuidsetup $user; }; - if ( $@ ) { - warn $@; - warn "sleeping for reconnect...\n"; - sleep 5; - } -} +#$@ = 'not connected'; +#while ( $@ ) { +# eval { adminsuidsetup $user; }; +# if ( $@ ) { +# warn $@; +# warn "sleeping for reconnect...\n"; +# sleep 5; +# } +#} +adminsuidsetup $user; my $log = FS::Log->new('queue'); logfile( "%%%FREESIDE_LOG%%%/queuelog.". $FS::UID::datasrc ); -- 2.11.0