From 8f7d49f0bd8e46e907316bb9b668c8358b4d1f81 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Tue, 5 May 2015 22:15:39 +0000 Subject: [PATCH] WIP: initialize EGWeb content loaders This patch adds the ability for EGWeb to call an initialization function for content loaders during the child_init phase of Apache backend startup. In particular, portions of the R/O object cache for EGCatLoader are now initialized when a backend starts up; testing indicates that this can shave a couple seconds off the time it takes for a backend to render a bib details page the first time. Signed-off-by: Galen Charlton --- Open-ILS/examples/apache/eg_startup.in | 2 +- Open-ILS/examples/apache_24/eg.conf.in | 1 + .../perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm | 27 ++++++++++++++++++++++ Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm | 25 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Open-ILS/examples/apache/eg_startup.in b/Open-ILS/examples/apache/eg_startup.in index 1d77c0529b..94a97b5056 100755 --- a/Open-ILS/examples/apache/eg_startup.in +++ b/Open-ILS/examples/apache/eg_startup.in @@ -10,7 +10,7 @@ use OpenILS::WWW::AddedContent qw( @sysconfdir@/opensrf_core.xml ); use OpenILS::WWW::Proxy ('@sysconfdir@/opensrf_core.xml'); use OpenILS::WWW::Vandelay qw( @sysconfdir@/opensrf_core.xml ); use OpenILS::WWW::TemplateBatchBibUpdate qw( @sysconfdir@/opensrf_core.xml ); -use OpenILS::WWW::EGWeb; +use OpenILS::WWW::EGWeb ('@sysconfdir@/opensrf_core.xml', 'OpenILS::WWW::EGCatLoader', 'en-US');; use OpenILS::WWW::IDL2js ('@sysconfdir@/opensrf_core.xml'); use OpenILS::WWW::FlatFielder; use OpenILS::WWW::PhoneList ('@sysconfdir@/opensrf_core.xml'); diff --git a/Open-ILS/examples/apache_24/eg.conf.in b/Open-ILS/examples/apache_24/eg.conf.in index b33581d1c5..33f7d03268 100644 --- a/Open-ILS/examples/apache_24/eg.conf.in +++ b/Open-ILS/examples/apache_24/eg.conf.in @@ -20,6 +20,7 @@ PerlChildInitHandler OpenILS::WWW::SuperCat::child_init PerlChildInitHandler OpenILS::WWW::AddedContent::child_init PerlChildInitHandler OpenILS::WWW::AutoSuggest::child_init PerlChildInitHandler OpenILS::WWW::PhoneList::child_init +PerlChildInitHandler OpenILS::WWW::EGWeb::child_init # ---------------------------------------------------------------------------------- # Set some defaults for our working directories diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm index 1e86db6853..bcf7e86f2b 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm @@ -25,6 +25,33 @@ our %cache = ( # cached data authority_fields => {en_us => {}} ); +sub child_init { + my $class = shift; + my $e = shift; + my @locales = @_; + + # create a stub object with just enough in place + # to call init_ro_object_cache() + my $stub = bless({}, ref($class) || $class); + my $ctx = {}; + $stub->editor($e); + $stub->ctx($ctx); + + $stub->init_ro_object_cache(); + foreach my $locale (@locales) { + $ctx->{locale} = $locale; + OpenSRF::AppSession->default_locale($locale); + + # pre-cache various sets of objects + # known to be time-consuming to retrieve + # the first go around + $ro_object_subs->{aou_tree}(); + $ro_object_subs->{aouct_tree}(); + $ro_object_subs->{get_ccvm}(); + $ro_object_subs->{get_authority_fields}(1); + } +} + sub init_ro_object_cache { my $self = shift; my $e = $self->editor; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm index 8b3fcbfb73..44d6f93b58 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGWeb.pm @@ -25,6 +25,31 @@ my %vhost_path_cache; # cache template processors by vhost my %vhost_processor_cache; +my $bootstrap_config; +my @context_loaders_to_preinit = (); +my @locales_to_preinit = (); + +sub import { + my ($self, $bootstrap_config, $loaders, $locales) = @_; + @context_loaders_to_preinit = split /\s+/, $loaders, -1 if defined($loaders); + @locales_to_preinit = split /\s+/, $locales, -1 if defined($locales); +} + +sub child_init { + OpenSRF::System->bootstrap_client(config_file => $bootstrap_config); + my $idl = OpenSRF::Utils::SettingsClient->new->config_value("IDL"); + Fieldmapper->import(IDL => $idl); + OpenILS::Utils::CStoreEditor->init; + my $e = new_editor(); + foreach my $loader (@context_loaders_to_preinit) { + eval { + $loader->use; + $loader->child_init($e, @locales_to_preinit); + }; + } + return Apache2::Const::OK; +} + sub handler { my $r = shift; my $stat = handler_guts($r); -- 2.11.0