Cache the FS::Conf info per page load, for performance.
authorJason Terry <jterry@bluehost.com>
Wed, 11 Feb 2015 22:32:08 +0000 (15:32 -0700)
committerIvan Kohler <ivan@freeside.biz>
Wed, 25 Feb 2015 02:49:51 +0000 (18:49 -0800)
Conflicts:
FS/FS/Conf.pm

FS/FS/Conf.pm
FS/FS/Daemon/Preforking.pm
FS/FS/UID.pm
FS/bin/freeside-queued

index c4e5af4..855c9f4 100644 (file)
@@ -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;
 
index f3a39a6..4c382eb 100644 (file)
@@ -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 );
index f41735d..4535799 100644 (file)
@@ -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);
index 7c4cf1b..4786132 100644 (file)
@@ -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 );