X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=perl%2FAmanda%2FRecovery%2FClerk.pm;h=c40d40f7de7d5e0b9e6d40f9fb38eaa75f5ea792;hb=691567b16c13087b31ee4c2b6d038e57872fae82;hp=1c462aca4ab02ea3826d98d86e7c7763af5915aa;hpb=b116e9366c7b2ea2c2eb53b0a13df4090e176235;p=debian%2Famanda diff --git a/perl/Amanda/Recovery/Clerk.pm b/perl/Amanda/Recovery/Clerk.pm index 1c462ac..c40d40f 100644 --- a/perl/Amanda/Recovery/Clerk.pm +++ b/perl/Amanda/Recovery/Clerk.pm @@ -1,8 +1,9 @@ -# Copyright (c) 2010 Zmanda, Inc. All Rights Reserved. +# Copyright (c) 2010-2012 Zmanda, Inc. All Rights Reserved. # -# This library is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License version 2.1 as -# published by the Free Software Foundation. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +#* License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY @@ -69,7 +70,7 @@ Amanda::Recovery::Clerk - handle assembling dumpfiles from multiple parts =head1 OVERVIEW -This package is the counterpart to L, and handles +This package is the counterpart to L, and handles re-assembling dumpfiles from multiple parts, possibly distributed over several volumes. @@ -228,12 +229,12 @@ sub get_xfer_src { my $self = shift; my %params = @_; - for my $rq_param qw(dump xfer_src_cb) { + for my $rq_param (qw(dump xfer_src_cb)) { croak "required parameter '$rq_param' missing" unless exists $params{$rq_param}; } - die "Clerk is already busy" if $self->{'xfer_state'}; + confess "Clerk is already busy" if $self->{'xfer_state'}; # set up a new xfer_state my $xfer_state = $self->{'xfer_state'} = { @@ -262,13 +263,13 @@ sub start_recovery { my %params = @_; $self->dbg("starting recovery"); - for my $rq_param qw(xfer recovery_cb) { + for my $rq_param (qw(xfer recovery_cb)) { croak "required parameter '$rq_param' missing" unless exists $params{$rq_param}; } - die "no xfer is in progress" unless $self->{'xfer_state'}; - die "get_xfer_src has not finished" + confess "no xfer is in progress" unless $self->{'xfer_state'}; + confess "get_xfer_src has not finished" if defined $self->{'xfer_state'}->{'xfer_src_cb'}; my $xfer_state = $self->{'xfer_state'}; @@ -300,18 +301,25 @@ sub handle_xmsg { sub quit { my $self = shift; my %params = @_; + my $finished_cb = $params{'finished_cb'}; - die "Cannot quit a Clerk while a transfer is in progress" - if $self->{'xfer_state'}; + confess "Cannot quit a Clerk while a transfer is in progress" + if $self->{'xfer_state'} and $self->{'xfer_state'}->{'xfer'}; - # if we have a reservation, we need to release it; otherwise, we can - # just call finished_cb - if ($self->{'current_res'}) { - $self->{'current_dev'}->finish(); - $self->{'current_res'}->release(finished_cb => $params{'finished_cb'}); - } else { - $params{'finished_cb'}->(); - } + my $steps = define_steps + cb_ref => \$finished_cb, + finalize => sub { $self->{'scan'}->quit() if defined $self->{'scan'} }; + + step release => sub { + # if we have a reservation, we need to release it; otherwise, we can + # just call finished_cb + if ($self->{'current_res'}) { + $self->{'current_dev'}->finish(); + $self->{'current_res'}->release(finished_cb => $finished_cb); + } else { + $finished_cb->(); + } + }; } sub _xmsg_ready { @@ -333,7 +341,7 @@ sub _xmsg_part_done { my $next_label = $xfer_state->{'next_part'}->{'label'}; my $next_filenum = $xfer_state->{'next_part'}->{'filenum'}; - die "read incorrect filenum" + confess "read incorrect filenum" unless $next_filenum == $msg->{'fileno'}; $self->dbg("done reading file $next_filenum on '$next_label'"); @@ -367,6 +375,7 @@ sub _xmsg_done { return $xfer_state->{'recovery_cb'}->( result => $result, errors => $xfer_state->{'errors'}, + bytes_read => $xfer_state->{'xfer_src'}->get_bytes_read() ); } @@ -409,7 +418,7 @@ sub _maybe_start_part { # first, see if anything remains to be done if (!exists $xfer_state->{'dump'}{'parts'}[$xfer_state->{'next_part_idx'}]) { # this should not happen until the xfer is started.. - die "xfer should be running already" + confess "xfer should be running already" unless $xfer_state->{'xfer'}; # tell the source to generate EOF