Imported Upstream version 3.3.1
[debian/amanda] / perl / Amanda / Taper / Worker.pm
index c114a81eb406cfe369d772e795e49761bb78eb3f..7e6b9ea136068fdfb772a328fa236f253919d3f2 100644 (file)
@@ -1,4 +1,3 @@
-#! @PERL@
 # Copyright (c) 2009, 2010 Zmanda Inc.  All Rights Reserved.
 #
 # This program is free software; you can redistribute it and/or modify it
@@ -42,6 +41,7 @@ package Amanda::Taper::Worker;
 use POSIX qw( :errno_h );
 use Amanda::Changer;
 use Amanda::Config qw( :getconf config_dir_relative );
+use Amanda::Debug qw( :logging );
 use Amanda::Header;
 use Amanda::Holding;
 use Amanda::MainLoop qw( :GIOCondition );
@@ -100,7 +100,8 @@ sub new {
     my $scribe = Amanda::Taper::Scribe->new(
        taperscan => $controller->{'taperscan'},
        feedback => $self,
-       debug => $Amanda::Config::debug_taper);
+       debug => $Amanda::Config::debug_taper,
+       eject_volume => getconf($CNF_EJECT_VOLUME));
 
     $self->{'scribe'} = $scribe;
     $self->{'scribe'}->start(write_timestamp => $write_timestamp,
@@ -240,6 +241,15 @@ sub FAILED {
     }
 }
 
+sub CLOSE_VOLUME {
+    my $self = shift;
+    my ($msgtype, %params) = @_;
+
+    $self->_assert_in_state("idle") or return;
+
+    $self->{'scribe'}->close_volume();
+}
+
 sub result_cb {
     my $self = shift;
     my %params = %{$self->{'dump_params'}};
@@ -373,6 +383,8 @@ sub scribe_notif_new_tape {
 
     # TODO: if $params{error} is set, report it back to the driver
     # (this will be a change to the protocol)
+    log_add($L_INFO, "$params{'error'}") if defined $params{'error'};
+
     if ($params{'volume_label'}) {
        $self->{'label'} = $params{'volume_label'};
 
@@ -436,7 +448,8 @@ sub scribe_notif_log_info {
     my $self = shift;
     my %params = @_;
 
-    log_add($L_INFO, $params{'message'});
+    debug("$params{'message'}");
+    log_add($L_INFO, "$params{'message'}");
 }
 
 ##
@@ -508,9 +521,6 @@ sub send_port_and_get_header {
        $header_xfer->start($steps->{'header_xfer_xmsg_cb'});
 
        my $header_addrs = $xsrc->get_addrs();
-       $header_addrs = [ grep { $_->[0] eq '127.0.0.1' } @$header_addrs ];
-       die "Source::DirectTCPListen did not return a localhost address"
-           unless @$header_addrs;
        my $header_port = $header_addrs->[0][1];
 
        # and tell the driver which ports we're listening on
@@ -526,7 +536,7 @@ sub send_port_and_get_header {
        if ($xmsg->{'type'} == $XMSG_INFO) {
            info($xmsg->{'message'});
        } elsif ($xmsg->{'type'} == $XMSG_ERROR) {
-           $errmsg = $xmsg->{'messsage'};
+           $errmsg = $xmsg->{'message'};
        } elsif ($xmsg->{'type'} == $XMSG_DONE) {
            if ($errmsg) {
                $finished_cb->($errmsg);
@@ -606,18 +616,23 @@ sub setup_and_start_dump {
                if (exists $splitting_args{$_});
        }
 
+       my $device = $self->{'scribe'}->get_device();
+       if (!defined $device) {
+           die "no device is available to create an xfer_dest";
+       }
+       $splitting_args{'leom_supported'} = $device->property_get("leom");
        # and convert those to get_xfer_dest args
         %get_xfer_dest_args = get_splitting_args_from_config(
                %splitting_args);
        $get_xfer_dest_args{'max_memory'} = getconf($CNF_DEVICE_OUTPUT_BUFFER_SIZE);
        if (!getconf_seen($CNF_DEVICE_OUTPUT_BUFFER_SIZE)) {
-           my $device = $self->{'scribe'}->get_device();
            my $block_size4 = $device->block_size * 4;
            if ($block_size4 > $get_xfer_dest_args{'max_memory'}) {
                $get_xfer_dest_args{'max_memory'} = $block_size4;
            }
        }
-       $get_xfer_dest_args{'can_cache_inform'} = ($msgtype eq Amanda::Taper::Protocol::FILE_WRITE);
+       $device = undef;
+       $get_xfer_dest_args{'can_cache_inform'} = ($msgtype eq Amanda::Taper::Protocol::FILE_WRITE and $get_xfer_dest_args{'allow_split'});
 
        # if we're unable to fulfill the user's splitting needs, we can still give
        # the dump a shot - but we'll warn them about the problem