Added advanceversion command to fdbcli
This commit is contained in:
parent
40aec61d30
commit
3a8efb2d0b
|
@ -165,6 +165,11 @@ getversion
|
|||
|
||||
The ``getversion`` command fetches the current read version of the cluster or currently running transaction.
|
||||
|
||||
advanceversion
|
||||
--------------
|
||||
|
||||
Forces the cluster to recover at the specified version. If the specified version is larger than the current version of the cluster, the cluster version is advanced to the specified version via a forced recovery.
|
||||
|
||||
help
|
||||
----
|
||||
|
||||
|
|
|
@ -521,6 +521,11 @@ void initHelp() {
|
|||
helpMap["getversion"] =
|
||||
CommandHelp("getversion", "Fetch the current read version",
|
||||
"Displays the current read version of the database or currently running transaction.");
|
||||
helpMap["advanceversion"] = CommandHelp(
|
||||
"advanceversion <VERSION>", "Force the cluster to recover at the specified version",
|
||||
"Forces the cluster to recover at the specified version. If the specified version is larger than the current "
|
||||
"version of the cluster, the cluster version is advanced "
|
||||
"to the specified version via a forced recovery.");
|
||||
helpMap["reset"] = CommandHelp(
|
||||
"reset",
|
||||
"reset the current transaction",
|
||||
|
@ -3095,6 +3100,23 @@ ACTOR Future<int> cli(CLIOptions opt, LineNoise* plinenoise) {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (tokencmp(tokens[0], "advanceversion")) {
|
||||
if (tokens.size() != 2) {
|
||||
printUsage(tokens[0]);
|
||||
is_error = true;
|
||||
} else {
|
||||
Version v;
|
||||
int n = 0;
|
||||
if (sscanf(tokens[1].toString().c_str(), "%ld%n", &v, &n) != 1 || n != tokens[1].size()) {
|
||||
printUsage(tokens[0]);
|
||||
is_error = true;
|
||||
} else {
|
||||
wait(makeInterruptable(advanceVersion(db, v)));
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tokencmp(tokens[0], "kill")) {
|
||||
getTransaction(db, tr, options, intrans);
|
||||
if (tokens.size() == 1) {
|
||||
|
|
|
@ -1755,6 +1755,26 @@ ACTOR Future<Void> checkDatabaseLock( Reference<ReadYourWritesTransaction> tr, U
|
|||
return Void();
|
||||
}
|
||||
|
||||
ACTOR Future<Void> advanceVersion(Database cx, Version v) {
|
||||
state Transaction tr(cx);
|
||||
loop {
|
||||
tr.setOption(FDBTransactionOptions::ACCESS_SYSTEM_KEYS);
|
||||
tr.setOption(FDBTransactionOptions::LOCK_AWARE);
|
||||
try {
|
||||
Version rv = wait(tr.getReadVersion());
|
||||
if (rv <= v) {
|
||||
tr.set(minRequiredCommitVersionKey, BinaryWriter::toValue(v + 1, Unversioned()));
|
||||
wait(tr.commit());
|
||||
} else {
|
||||
printf("Current read version is %ld\n", rv);
|
||||
return Void();
|
||||
}
|
||||
} catch (Error& e) {
|
||||
wait(tr.onError(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ACTOR Future<Void> forceRecovery( Reference<ClusterConnectionFile> clusterFile, Key dcId ) {
|
||||
state Reference<AsyncVar<Optional<ClusterInterface>>> clusterInterface(new AsyncVar<Optional<ClusterInterface>>);
|
||||
state Future<Void> leaderMon = monitorLeader<ClusterInterface>(clusterFile, clusterInterface);
|
||||
|
|
|
@ -178,6 +178,8 @@ ACTOR Future<Void> unlockDatabase( Database cx, UID id );
|
|||
ACTOR Future<Void> checkDatabaseLock( Transaction* tr, UID id );
|
||||
ACTOR Future<Void> checkDatabaseLock( Reference<ReadYourWritesTransaction> tr, UID id );
|
||||
|
||||
ACTOR Future<Void> advanceVersion(Database cx, Version v);
|
||||
|
||||
ACTOR Future<int> setDDMode( Database cx, int mode );
|
||||
|
||||
ACTOR Future<Void> forceRecovery( Reference<ClusterConnectionFile> clusterFile, Standalone<StringRef> dcId );
|
||||
|
|
Loading…
Reference in New Issue