Merge tag 'upstream/3.3.2'
[debian/amanda] / perl / Amanda / Changer / rait.pm
index 6561f058c0c9485f211c237ff2923a34d9ab6fe2..d387c841246d8c4e3a763c909594a21746a6d302 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2009,2010 Zmanda, Inc.  All Rights Reserved.
+# Copyright (c) 2009-2012 Zmanda, Inc.  All Rights Reserved.
 #
 # This program is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License version 2 as published
@@ -20,6 +20,7 @@ package Amanda::Changer::rait;
 
 use strict;
 use warnings;
+use Carp;
 use vars qw( @ISA );
 @ISA = qw( Amanda::Changer );
 
@@ -64,8 +65,12 @@ sub new {
        my @annotated_errs;
        for my $i (0 .. @children-1) {
            next unless $children[$i]->isa("Amanda::Changer::Error");
-           push @annotated_errs,
-               [ $kidspecs[$i], $children[$i] ];
+           if ($children[$i]->isa("Amanda::Changer::Error")) {
+               push @annotated_errs,
+                   [ $kidspecs[$i], $children[$i] ];
+           } elsif ($children[$i]->isa("Amanda::Changer")) {
+               $children[$i]->quit();
+           }
        }
        return Amanda::Changer->make_combined_error(
                "fatal", [ @annotated_errs ]);
@@ -81,6 +86,17 @@ sub new {
     return $self;
 }
 
+sub quit {
+    my $self = shift;
+
+    # quit each child
+    foreach my $child (@{$self->{'children'}}) {
+       $child->quit() if $child ne "ERROR";
+    }
+
+    $self->SUPER::quit();
+}
+
 # private method to help handle slot input
 sub _kid_slots_ok {
     my ($self, $res_cb, $slot, $kid_slots_ref, $err_ref) = @_;
@@ -304,6 +320,7 @@ sub info_key {
                next unless exists($kid_info{'num_slots'});
                my $kid_num_slots = $kid_info{'num_slots'};
                if (defined $num_slots and $num_slots != $kid_num_slots) {
+                   debug("chg-rait: children have different slot counts!");
                    $num_slots = -1;
                } else {
                    $num_slots = $kid_num_slots;
@@ -509,7 +526,7 @@ sub _for_each_child {
        ($params{'oksub'}, $params{'errsub'}, $params{'parent_cb'}, $params{'args'});
 
     if (defined($args)) {
-       die "number of args did not match number of children"
+       confess "number of args did not match number of children"
            unless (@$args == $self->{'num_children'});
     } else {
        $args = [ ( undef ) x $self->{'num_children'} ];