marsadm: fix 'invalidate' racing against replay

This commit is contained in:
Thomas Schoebel-Theuer 2013-07-15 13:44:08 +02:00
parent 22d4516d21
commit ddf28af52d
2 changed files with 29 additions and 6 deletions

View File

@ -3077,10 +3077,13 @@ done:
}
}
_show_actual(rot->parent_path, "is-replaying", rot->trans_brick && rot->trans_brick->replay_mode && !rot->trans_brick->power.led_off);
if (rot->trans_brick)
_show_rate(rot, &rot->replay_limiter, rot->trans_brick->power.led_on, "replay_rate");
_show_actual(rot->parent_path, "is-copying", rot->copy_brick && !rot->copy_brick->power.led_off);
if (rot->copy_brick)
_show_rate(rot, &rot->file_limiter, rot->copy_brick->power.led_on, "file_rate");
_show_actual(rot->parent_path, "is-syncing", rot->sync_brick && !rot->sync_brick->power.led_off);
if (rot->sync_brick)
_show_rate(rot, &rot->sync_limiter, rot->sync_brick->power.led_on, "sync_rate");
err:

View File

@ -202,6 +202,12 @@ sub wait_cond {
(
"attach" => "is-attached",
"attached" => "is-attached",
"replay" => "is-replaying",
"replaying"=> "is-replaying",
"copy" => "is-copying",
"copying" => "is-copying",
"sync" => "is-syncing",
"syncing" => "is-syncing",
"primary" => "is-primary",
);
my $name = $table{$specific};
@ -1391,13 +1397,23 @@ sub cleanup_res {
sub invalidate_res_phase0 {
my ($cmd, $res) = @_;
check_not_primary(@_);
if (!$force) {
check_todo($cmd, $res, "attach", 0, 0);
check_status($cmd, $res, "is-attached", 0, 0, 1);
}
}
sub invalidate_res_phase1 {
my ($cmd, $res) = @_;
_switch($cmd, $res, "$mars/resource-$res/todo-$host/sync", 0);
_switch($cmd, $res, "$mars/resource-$res/todo-$host/allow-replay", 0);
}
sub invalidate_res_phase2 {
my ($cmd, $res) = @_;
if (!$force) {
check_status($cmd, $res, "is-syncing", 0, 1);
check_status($cmd, $res, "is-replaying", 0, 1);
}
}
sub invalidate_res_phase3 {
my ($cmd, $res) = @_;
my $dst = "$mars/resource-$res/syncstatus-$host";
my $primary = _get_designated_primary($res);
@ -1406,8 +1422,10 @@ sub invalidate_res_phase1 {
my $replay_nr = $1;
set_link("0", $dst);
finish_links(); # opportunity for errors => don't continue
_set_replaylink("$mars/resource-$res", $replay_nr, $primary);
set_link($replay, "$mars/resource-$res/replay-$host");
cleanup_res($cmd, $res, $replay_nr);
_switch($cmd, $res, "$mars/resource-$res/todo-$host/allow-replay", 1);
_switch($cmd, $res, "$mars/resource-$res/todo-$host/sync", 1);
}
sub resize_res {
@ -1670,7 +1688,9 @@ my %cmd_table =
],
"invalidate" => [
"check preconditions", \&invalidate_res_phase0,
"force symlinks", \&invalidate_res_phase1,
"stop old replay", \&invalidate_res_phase1,
"wait for replay off", \&invalidate_res_phase2,
"force symlinks", \&invalidate_res_phase3,
],
"invalidate-remote" => \&forbidden_cmd,
"resize" => \&resize_res,