drbd: correctly check all result codes
This commit is contained in:
@ -66,12 +66,13 @@ sub connect_drbdmanage_service {
|
|||||||
return $hdl;
|
return $hdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub check_drbd_rc {
|
sub check_drbd_res {
|
||||||
my ($rc) = @_;
|
my ($rc) = @_;
|
||||||
|
|
||||||
die "got undefined drbd rc\n" if !$rc;
|
die "got undefined drbd result\n" if !$rc;
|
||||||
|
|
||||||
my ($code, $msg, $details) = @$rc;
|
foreach my $res (@$rc) {
|
||||||
|
my ($code, $msg, $details) = @$res;
|
||||||
|
|
||||||
return undef if $code == 0;
|
return undef if $code == 0;
|
||||||
|
|
||||||
@ -84,13 +85,16 @@ sub check_drbd_rc {
|
|||||||
die "drbd error: $msg\n";
|
die "drbd error: $msg\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
sub drbd_list_volumes {
|
sub drbd_list_volumes {
|
||||||
my ($hdl) = @_;
|
my ($hdl) = @_;
|
||||||
|
|
||||||
$hdl = connect_drbdmanage_service() if !$hdl;
|
$hdl = connect_drbdmanage_service() if !$hdl;
|
||||||
|
|
||||||
my ($rc, $res) = $hdl->list_volumes([], 0, {}, []);
|
my ($rc, $res) = $hdl->list_volumes([], 0, {}, []);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
my $volumes = {};
|
my $volumes = {};
|
||||||
|
|
||||||
@ -178,15 +182,15 @@ sub alloc_image {
|
|||||||
if !defined($name);
|
if !defined($name);
|
||||||
|
|
||||||
my ($rc, $res) = $hdl->create_resource($name, {});
|
my ($rc, $res) = $hdl->create_resource($name, {});
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
($rc, $res) = $hdl->create_volume($name, $size, {});
|
($rc, $res) = $hdl->create_volume($name, $size, {});
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
my $redundancy = get_redundancy($scfg);;
|
my $redundancy = get_redundancy($scfg);;
|
||||||
|
|
||||||
($rc, $res) = $hdl->auto_deploy($name, $redundancy, 0, 0);
|
($rc, $res) = $hdl->auto_deploy($name, $redundancy, 0, 0);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
# hack: this is required to avoid bugs with set_drbdsetup_props(),
|
# hack: this is required to avoid bugs with set_drbdsetup_props(),
|
||||||
# which can result in a split brain if we do not wait.
|
# which can result in a split brain if we do not wait.
|
||||||
@ -194,7 +198,7 @@ sub alloc_image {
|
|||||||
my $max_wait = 15;
|
my $max_wait = 15;
|
||||||
for (my $i = 0; $i < $max_wait; $i++) {
|
for (my $i = 0; $i < $max_wait; $i++) {
|
||||||
($rc, $res) = $hdl->list_assignments([], [$name], 0, { "cstate:deploy" => "true" }, []);
|
($rc, $res) = $hdl->list_assignments([], [$name], 0, { "cstate:deploy" => "true" }, []);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
my $len = scalar(@$res);
|
my $len = scalar(@$res);
|
||||||
last if $len == $redundancy;
|
last if $len == $redundancy;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
@ -208,7 +212,7 @@ sub alloc_image {
|
|||||||
type => 'neto',
|
type => 'neto',
|
||||||
'allow-two-primaries' => 'yes',
|
'allow-two-primaries' => 'yes',
|
||||||
});
|
});
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
return $name;
|
return $name;
|
||||||
}
|
}
|
||||||
@ -218,7 +222,7 @@ sub free_image {
|
|||||||
|
|
||||||
my $hdl = connect_drbdmanage_service();
|
my $hdl = connect_drbdmanage_service();
|
||||||
my ($rc, $res) = $hdl->remove_resource($volname, 0);
|
my ($rc, $res) = $hdl->remove_resource($volname, 0);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -265,7 +269,7 @@ sub status {
|
|||||||
my $hdl = connect_drbdmanage_service();
|
my $hdl = connect_drbdmanage_service();
|
||||||
my $redundancy = get_redundancy($scfg);;
|
my $redundancy = get_redundancy($scfg);;
|
||||||
my ($rc, $res) = $hdl->cluster_free_query($redundancy);
|
my ($rc, $res) = $hdl->cluster_free_query($redundancy);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
$avail = $res;
|
$avail = $res;
|
||||||
$used = 0; # fixme
|
$used = 0; # fixme
|
||||||
@ -302,7 +306,7 @@ sub activate_volume {
|
|||||||
my $hdl = connect_drbdmanage_service();
|
my $hdl = connect_drbdmanage_service();
|
||||||
my $nodename = PVE::INotify::nodename();
|
my $nodename = PVE::INotify::nodename();
|
||||||
my ($rc, $res) = $hdl->list_assignments([$nodename], [], 0, {}, []);
|
my ($rc, $res) = $hdl->list_assignments([$nodename], [], 0, {}, []);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
foreach my $entry (@$res) {
|
foreach my $entry (@$res) {
|
||||||
my ($node, $res_name, $props, $voldata) = @$entry;
|
my ($node, $res_name, $props, $voldata) = @$entry;
|
||||||
@ -313,14 +317,14 @@ sub activate_volume {
|
|||||||
|
|
||||||
# create diskless assignment
|
# create diskless assignment
|
||||||
($rc, $res) = $hdl->assign($nodename, $volname, { diskless => 'true' });
|
($rc, $res) = $hdl->assign($nodename, $volname, { diskless => 'true' });
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
|
|
||||||
# wait until device is acessitble
|
# wait until device is acessitble
|
||||||
my $print_warning = 1;
|
my $print_warning = 1;
|
||||||
my $max_wait_time = 20;
|
my $max_wait_time = 20;
|
||||||
for (my $i = 0;; $i++) {
|
for (my $i = 0;; $i++) {
|
||||||
($rc, $res) = $hdl->list_assignments([$nodename], [$volname], 0, { "cstate:deploy" => "true" }, []);
|
($rc, $res) = $hdl->list_assignments([$nodename], [$volname], 0, { "cstate:deploy" => "true" }, []);
|
||||||
check_drbd_rc($rc->[0]);
|
check_drbd_res($rc);
|
||||||
my $len = scalar(@$res);
|
my $len = scalar(@$res);
|
||||||
last if $len > 0;
|
last if $len > 0;
|
||||||
die "aborting wait - device '$path' still not readable\n" if $i > $max_wait_time;
|
die "aborting wait - device '$path' still not readable\n" if $i > $max_wait_time;
|
||||||
|
|||||||
Reference in New Issue
Block a user