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 [email protected]
>From 3bccbfe57c350b8db2a3f9d0812f6fa5548c7f2e Mon Sep 17 00:00:00 2001
From: Niko Tyni <[email protected]>
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