Bug 13431 - Shared FastMmap file causes issues

Koha::Cache package does not take into account that, when using
fastmmap caching variant, mmaped cache file created in /tmp
(typically: /tmp/sharefile-koha-koha), would only be further
accessible to the one given OS user - the one which created it.
In many Koha setups, in the circumstances when various system scripts
are executed by 2+ users with diffrent UIDs (like multi-tenant servers,
for example) this may cause many kinds of issues. Observable symptom
is usually the appearance of the below error when searching, or looking
at MARC Framework pages and a few other places:

Open of share file /tmp/sharefile-koha-koha failed: Permission denied
at /usr/lib/perl5/Cache/FastMmap.pm line 640.

This patch:
- disables initialisation of fastmmap caching subsystem unless it is
explicitly requested by the user (CACHING_SYSTEM=fastmmap)
- disables fastmmap cache usage for command line scripts
(i.e. when GATEWAY_INTERFACE environment variable is not defined)
- adds the database name, host name and an ID of the OS user to the
mmaped file name created in /tmp, to prevent various kinds of
unintentional conflicts and/or permission problems from happening

To test:

1) remove the /tmp/sharefile-koha-* file[s] (if any)
2) do something which would lead to its re-creation (e.g., performing
any search in OPAC should be sufficient to cause that)
3) observe that /tmp/sharefile-koha-koha got created
4) remove it
5) apply patch
6) redo step 2)
7) observe that aforementioned file is no longer created in /tmp
8) set CACHING_SYSTEM environment variable to 'fastmmap'
9) redo step 2), observe that /tmp/sharefile-koha-* file got created
and that it's name now contains hostname, database name and UID
10) ensure that everything still works like it should and that there
are no regressions of any kinds anywhere in the system ;)

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
Jacek Ablewicz 2014-12-16 12:48:09 +01:00 committed by Tomas Cohen Arazi
parent 155ce56ad8
commit 9e701294dd

View file

@ -40,6 +40,7 @@ use warnings;
use Carp; use Carp;
use Module::Load::Conditional qw(can_load); use Module::Load::Conditional qw(can_load);
use Koha::Cache::Object; use Koha::Cache::Object;
use C4::Context;
use base qw(Class::Accessor); use base qw(Class::Accessor);
@ -90,10 +91,11 @@ sub new {
} }
} }
if ( can_load( modules => { 'Cache::FastMmap' => undef } ) ) { if ( $self->{'default_type'} eq 'fastmmap'
&& defined( $ENV{GATEWAY_INTERFACE} )
&& can_load( modules => { 'Cache::FastMmap' => undef } ) ) {
_initialize_fastmmap($self); _initialize_fastmmap($self);
if ( $self->{'default_type'} eq 'fastmmap' if ( defined( $self->{'fastmmap_cache'} ) )
&& defined( $self->{'fastmmap_cache'} ) )
{ {
$self->{'cache'} = $self->{'fastmmap_cache'}; $self->{'cache'} = $self->{'fastmmap_cache'};
} }
@ -159,9 +161,13 @@ sub _initialize_memcached {
sub _initialize_fastmmap { sub _initialize_fastmmap {
my ($self) = @_; my ($self) = @_;
my $share_file = join( '-',
"/tmp/sharefile-koha", $self->{'namespace'},
C4::Context->config('hostname'), C4::Context->config('database'),
"" . getpwuid($>) );
$self->{'fastmmap_cache'} = Cache::FastMmap->new( $self->{'fastmmap_cache'} = Cache::FastMmap->new(
'share_file' => "/tmp/sharefile-koha-$self->{'namespace'}", 'share_file' => $share_file,
'expire_time' => $self->{'timeout'}, 'expire_time' => $self->{'timeout'},
'unlink_on_exit' => 0, 'unlink_on_exit' => 0,
); );