From 8d93439dcb5a01ebe23688faabfc1d55875ec69c Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Thu, 18 Apr 2013 10:37:14 +0200 Subject: [PATCH] marsadm: add new command 'set-replay' --- kernel/sy_old/mars_light.c | 19 +++++++++++++++++-- userspace/marsadm | 21 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/kernel/sy_old/mars_light.c b/kernel/sy_old/mars_light.c index d9f3c007..7a619e5b 100644 --- a/kernel/sy_old/mars_light.c +++ b/kernel/sy_old/mars_light.c @@ -815,8 +815,23 @@ int _update_version_link(struct mars_rotate *rot, struct trans_logger_info *inf) if (unlikely((inf->inf_sequence < rot->inf_prev_sequence || inf->inf_sequence > rot->inf_prev_sequence + 1) && rot->inf_prev_sequence != 0)) { - MARS_ERR_TO(rot->log_say, "SKIP in sequence numbers detected: %d != %d + 1\n", inf->inf_sequence, rot->inf_prev_sequence); - goto out; + char *skip_path = path_make("%s/skip-check-%s", rot->parent_path, my_id()); + char *skip_link = mars_readlink(skip_path); + int skip_nr = -1; + if (skip_link) { + (void)sscanf(skip_link, "%d", &skip_nr); + brick_string_free(skip_link); + } + brick_string_free(skip_path); + if (likely(skip_nr != inf->inf_sequence)) { + MARS_ERR_TO(rot->log_say, "SKIP in sequence numbers detected: %d != %d + 1\n", inf->inf_sequence, rot->inf_prev_sequence); + goto out; + } + MARS_WRN_TO(rot->log_say, + "you explicitly requested to SKIP sequence numbers from %d to %d" + "-- THIS IS EXTREMELY RISKY" + "-- any inconsistencies are on your own!\n", + rot->inf_prev_sequence, inf->inf_sequence); } prev = path_make("%s/version-%09d-%s", rot->parent_path, inf->inf_sequence - 1, my_id()); if (unlikely(!prev)) { diff --git a/userspace/marsadm b/userspace/marsadm index f5661cd1..a00d07c7 100755 --- a/userspace/marsadm +++ b/userspace/marsadm @@ -929,6 +929,26 @@ sub up_res { } } +sub set_replay_res { + my ($cmd, $res, $new_nr) = @_; + if (!$new_nr || $new_nr <= 0) { + ldie "you must supply a numeric logfile number as third argument.\n"; + } + check_not_primary(@_); + check_todo($cmd, $res, "allow-replay", 0, 0); + my $replaylink = "$mars/resource-$res/replay-$host"; + my $old_val = get_link($replaylink); + my $old_nr = $old_val; + $old_nr =~ s/log-([0-9]+)-.*/$1/; + ldie "old log number '$old_nr' is wrong\n" unless $old_nr > 0; + if ($new_nr > $old_nr) { + lwarn "you try to skip logfile numbers from $old_nr to $new_nr, are you sure?\n"; + ldie "you would need --force if you really know what you are doing.\n" unless $force; + } + _set_replaylink("$mars/resource-$res", $new_nr, ""); + symlink("$new_nr", "$mars/resource-$res/skip-check-$host"); +} + sub fake_local_res { my ($cmd, $res) = @_; my $path = "$mars/resource-$res/todo-$host/sync"; @@ -1193,6 +1213,7 @@ my %cmd_table = "resume-replay" => \&pause_replay_res, "pause-replay-local" => \&pause_replay_local_res, "resume-replay-local" => \&pause_replay_local_res, + "set-replay" => \&set_replay_res, # compatible keywords (or their derivatives) "attach" => \&attach_res,