tag 525711 patch thanks On Sun, Apr 26, 2009 at 08:39:30PM +0200, gregor herrmann wrote: > On Sun, 26 Apr 2009 10:43:37 -0700, Daniel Schepler wrote: > > > /usr/bin/make test > > make[1]: Entering directory `/tmp/buildd/libipc-sharedcache-perl-1.3' > > PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl > > 1..9 > > ok 1 > > Failed to create share at blib/lib/IPC/SharedCache.pm line 941 > > make[1]: *** [test_dynamic] Error 2 > > make[1]: Leaving directory `/tmp/buildd/libipc-sharedcache-perl-1.3' > > make: *** [build-stamp] Error 2 > > dpkg-buildpackage: failure: debian/rules build gave error exit status 2 > > Confirmed. > The test failures can also be seen at > http://www.cpantesters.org/show/IPC-SharedCache.html#IPC-SharedCache-1.3 > > I've I test against an older libipc-sharelite-perl (from stable) the > tests pass.
This is caused by this change between IPC::ShareLite 0.13 and 0.17: -The constructor returns the undefined value on error. +The constructor croaks on error. [...] $self->{share} = new_share( $self->{key}, $self->{size}, $self->{flags} ) - or return undef; + or croak "Failed to create share"; The attached simple-minded patch wraps the IPC::ShareLite->new() calls inside eval {} blocks. This makes the tests pass for me with both libipc-sharelite-perl 0.13-1+b1 and 0.17-1. The code probably should probably report the $@ value on failure or something like that, but that's probably best left to the upstream author to decide. I'll update the upstream ticket too. Cheers, -- Niko Tyni nt...@debian.org
>From 3bccbfe57c350b8db2a3f9d0812f6fa5548c7f2e Mon Sep 17 00:00:00 2001 From: Niko Tyni <nt...@debian.org> Date: Sun, 26 Apr 2009 23:07:03 +0300 Subject: [PATCH] Wrap IPC::ShareLite->new() calls inside eval{} blocks. As of IPC::ShareLite 0.14, its constructor croaks on error where it used to return an empty value. This breaks the IPC::SharedCache test suite. http://bugs.debian.org/525711 http://rt.cpan.org/Public/Bug/Display.html?id=45450 --- SharedCache.pm | 36 +++++++++++++++++++++++++++--------- 1 files changed, 27 insertions(+), 9 deletions(-) diff --git a/SharedCache.pm b/SharedCache.pm index 30bca21..51eabcf 100644 --- a/SharedCache.pm +++ b/SharedCache.pm @@ -580,11 +580,13 @@ sub STORE { my $share; if (exists $root_record->{'map'}{$key}) { # we've got a key, get the share and cache it - $share = IPC::ShareLite->new('-key' => $root_record->{'map'}{$key}, + $share = eval { + IPC::ShareLite->new('-key' => $root_record->{'map'}{$key}, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 0, '-destroy' => 0); + }; confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share; $root_record->{'size'} -= $root_record->{'length_map'}{$key}; @@ -596,13 +598,15 @@ sub STORE { for ( my $end = $obj_ipc_key + 10000 ; $obj_ipc_key != $end ; $obj_ipc_key++ ) { - $share = IPC::ShareLite->new('-key' => $obj_ipc_key, + $share = eval { + IPC::ShareLite->new('-key' => $obj_ipc_key, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 1, '-exclusive' => 1, '-destroy' => 0, ); + }; last if defined $share; } croak("IPC::SharedCache : searched through 10,000 consecutive locations for a free shared memory segment, giving up : $!") @@ -625,11 +629,13 @@ sub STORE { my $delete_key = shift @{$root_record->{'queue'}}; # delete the segment for this object { - my $share = IPC::ShareLite->new('-key' => $root_record->{map}{$delete_key}, + my $share = eval { + IPC::ShareLite->new('-key' => $root_record->{map}{$delete_key}, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 0, '-destroy' => 1); + }; confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share; # share is now deleted since destroy == 1 and $share goes out of scope } @@ -684,11 +690,13 @@ sub DELETE { # delete the segment for this object { - my $share = IPC::ShareLite->new('-key' => $obj_ipc_key, + my $share = eval { + IPC::ShareLite->new('-key' => $obj_ipc_key, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 0, '-destroy' => 1); + }; confess("IPC::SharedCache: Unable to get shared cache block $root_record->{'map'}{$key} : $!") unless defined $share; # share is now deleted since destroy == 1 and $share goes out of scope } @@ -830,11 +838,13 @@ sub walk { require "Data/Dumper.pm"; # make sure the cache actually exists here - my $test = IPC::ShareLite->new('-key' => $key, + my $test = eval { + IPC::ShareLite->new('-key' => $key, '-mode' => 0666, '-size' => $segment_size, '-create' => 0, '-destroy' => 0); + }; die "Unable to find a cache at key $key : $!" unless defined $test; my %self; @@ -911,10 +921,12 @@ sub remove { # delete the root segment { - my $share = IPC::ShareLite->new('-key' => $key, + my $share = eval { + IPC::ShareLite->new('-key' => $key, '-size' => $segment_size, '-create' => 0, '-destroy' => 1); + }; confess("IPC::SharedCache: Unable to get shared cache block $key : $!") unless defined $share; # share is now deleted since destroy == 1 and $share goes out of scope } @@ -938,11 +950,13 @@ sub _init_root { return if defined $root; # try to get a handle on an existing root for this key - $root = IPC::ShareLite->new('-key' => $ipc_key, + $root = eval { + IPC::ShareLite->new('-key' => $ipc_key, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 0, '-destroy' => 0); + }; if (defined $root) { $ROOT_SHARE_CACHE{$ipc_key} = $root; return; @@ -961,12 +975,14 @@ sub _init_root { # if $options->{debug}; # try to create it if that didn't work (and do initialization) - $root = IPC::ShareLite->new('-key' => $options->{ipc_key}, + $root = eval { + IPC::ShareLite->new('-key' => $options->{ipc_key}, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 1, '-exclusive' => 1, '-destroy' => 0); + }; confess("IPC::SharedCache object initialization : Unable to initialize root ipc shared memory segment : $!") unless defined($root); @@ -1032,11 +1048,13 @@ sub _get_share_object { my $options = $self->{options}; # we've got a key, get the share and cache it - my $share = IPC::ShareLite->new('-key' => $obj_ipc_key, + my $share = eval { + IPC::ShareLite->new('-key' => $obj_ipc_key, '-mode' => $options->{ipc_mode}, '-size' => $options->{ipc_segment_size}, '-create' => 0, '-destroy' => 0); + }; confess("IPC::SharedCache: Unable to get shared cache block $obj_ipc_key : $!") unless defined $share; # get the cache block -- 1.6.2.4