aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-05-25 10:35:58 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-05-25 10:35:58 +0300
commitde6a3ad4fb4fc61bfa97cd2a7cb902248200448a (patch)
tree779a0a37f2a5f159deeedf5833d38acd666ed126 /lib
parentb8ea8b4038eab296f9aa64aa5b60922f9cf63c1a (diff)
downloadglacier-de6a3ad4fb4fc61bfa97cd2a7cb902248200448a.tar.gz
glacier-de6a3ad4fb4fc61bfa97cd2a7cb902248200448a.tar.bz2
Error checking when opening gdbm
* lib/App/Glacier/DB/GDBM.pm (new): New keyword argument "retries". Set the _retries attribute. (_tied): Check return value from tie. In case of failure, retry at most _retries times, with one second interval between retries
Diffstat (limited to 'lib')
-rw-r--r--lib/App/Glacier/DB/GDBM.pm11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/App/Glacier/DB/GDBM.pm b/lib/App/Glacier/DB/GDBM.pm
index f213e5d..075dc0c 100644
--- a/lib/App/Glacier/DB/GDBM.pm
+++ b/lib/App/Glacier/DB/GDBM.pm
@@ -11,10 +11,12 @@ sub new {
my $filename = shift;
local %_ = @_;
my $mode = delete $_{mode} || 0644;
+ my $retries = delete $_{retries} || 10;
my $self = $class->SUPER::new(%_);
$self->{_filename} = $filename;
$self->{_mode} = $mode;
$self->{_nref} = 0;
+ $self->{_retries} = $retries;
$self->{_deleted} = [];
return $self;
}
@@ -28,7 +30,14 @@ sub _tied {
my ($self, $code) = @_;
croak "argument must be a CODE ref" unless ref($code) eq 'CODE';
if ($self->{_nref}++ == 0) {
- tie %{$self->{_map}}, 'GDBM_File', $self->{_filename}, GDBM_WRCREAT, $self->{_mode};
+ my $n = 0;
+ while (! tie %{$self->{_map}}, 'GDBM_File', $self->{_filename},
+ GDBM_WRCREAT, $self->{_mode}) {
+ if ($n++ > $self->{_retries}) {
+ croak "can't open file $self->{_filename}: $!";
+ }
+ sleep(1);
+ }
}
my $ret = wantarray ? [ &{$code}() ] : &{$code}();
if (--$self->{_nref} == 0) {

Return to:

Send suggestions and report system problems to the System administrator.