Generalize RestoreConfig class.
This commit is contained in:
parent
8ac750672b
commit
32a690bce8
|
@ -125,14 +125,18 @@ Future<std::vector<KeyBackedTag>> getAllBackupTags(Reference<ReadYourWritesTrans
|
||||||
return TagUidMap(fileBackupPrefixRange.begin).getAll(tr);
|
return TagUidMap(fileBackupPrefixRange.begin).getAll(tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
class RestoreConfig {
|
class KeyBackedConfig {
|
||||||
public:
|
public:
|
||||||
static struct {
|
static struct {
|
||||||
static TaskParam<UID> uid() { return LiteralStringRef(__FUNCTION__); }
|
static TaskParam<UID> uid() {return LiteralStringRef(__FUNCTION__); }
|
||||||
} TaskParams;
|
} TaskParams;
|
||||||
|
|
||||||
RestoreConfig(UID uid = UID()) : uid(uid), configSpace(uidPrefixKey(LiteralStringRef("uid->config/").withPrefix(fileRestorePrefixRange.begin), uid)) {}
|
KeyBackedConfig(StringRef prefix, UID uid = UID()) :
|
||||||
RestoreConfig(Reference<Task> task) : RestoreConfig(TaskParams.uid().get(task)) {}
|
uid(uid),
|
||||||
|
prefix(prefix),
|
||||||
|
configSpace(uidPrefixKey(LiteralStringRef("uid->config/").withPrefix(prefix), uid)) {}
|
||||||
|
|
||||||
|
KeyBackedConfig(StringRef prefix, Reference<Task> task) : KeyBackedConfig(prefix, TaskParams.uid().get(task)) {}
|
||||||
|
|
||||||
Future<Void> toTask(Reference<ReadYourWritesTransaction> tr, Reference<Task> task) {
|
Future<Void> toTask(Reference<ReadYourWritesTransaction> tr, Reference<Task> task) {
|
||||||
// Set the uid task parameter
|
// Set the uid task parameter
|
||||||
|
@ -141,11 +145,12 @@ public:
|
||||||
// Get this uid's tag, then get the KEY for the tag's uid but don't read it. That becomes the validation key
|
// Get this uid's tag, then get the KEY for the tag's uid but don't read it. That becomes the validation key
|
||||||
// which TaskBucket will check, and its value must be this restore config's uid.
|
// which TaskBucket will check, and its value must be this restore config's uid.
|
||||||
UID u = uid; // 'this' could be invalid in lambda
|
UID u = uid; // 'this' could be invalid in lambda
|
||||||
return map(tag().get(tr), [u,task](Optional<Value> const &tag) -> Void {
|
Key p = prefix;
|
||||||
|
return map(tag().get(tr), [u,p,task](Optional<Value> const &tag) -> Void {
|
||||||
if(!tag.present())
|
if(!tag.present())
|
||||||
throw restore_error();
|
throw restore_error();
|
||||||
// Validation contition is that the uidPair key must be exactly {u, false}
|
// Validation contition is that the uidPair key must be exactly {u, false}
|
||||||
TaskBucket::setValidationCondition(task, makeRestoreTag(tag.get()).key, Codec<UidAndAbortedFlagT>::pack({u, false}).pack());
|
TaskBucket::setValidationCondition(task, KeyBackedTag(tag.get(), p).key, Codec<UidAndAbortedFlagT>::pack({u, false}).pack());
|
||||||
return Void();
|
return Void();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -153,6 +158,24 @@ public:
|
||||||
KeyBackedProperty<Value> tag() {
|
KeyBackedProperty<Value> tag() {
|
||||||
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UID getUid() { return uid; }
|
||||||
|
|
||||||
|
void clear(Reference<ReadYourWritesTransaction> tr) {
|
||||||
|
tr->clear(configSpace.range());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UID uid;
|
||||||
|
Key prefix;
|
||||||
|
Subspace configSpace;
|
||||||
|
};
|
||||||
|
|
||||||
|
class RestoreConfig : public KeyBackedConfig {
|
||||||
|
public:
|
||||||
|
RestoreConfig(UID uid = UID()) : KeyBackedConfig(fileRestorePrefixRange.begin, uid) {}
|
||||||
|
RestoreConfig(Reference<Task> task) : KeyBackedConfig(fileRestorePrefixRange.begin, task) {}
|
||||||
|
|
||||||
KeyBackedProperty<ERestoreState> stateEnum() {
|
KeyBackedProperty<ERestoreState> stateEnum() {
|
||||||
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
||||||
}
|
}
|
||||||
|
@ -210,10 +233,6 @@ public:
|
||||||
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
return configSpace.pack(LiteralStringRef(__FUNCTION__));
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear(Reference<ReadYourWritesTransaction> tr) {
|
|
||||||
tr->clear(configSpace.range());
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<bool> isRunnable(Reference<ReadYourWritesTransaction> tr) {
|
Future<bool> isRunnable(Reference<ReadYourWritesTransaction> tr) {
|
||||||
return map(stateEnum().getD(tr), [](ERestoreState s) -> bool { return s != ERestoreState::ABORTED
|
return map(stateEnum().getD(tr), [](ERestoreState s) -> bool { return s != ERestoreState::ABORTED
|
||||||
&& s != ERestoreState::COMPLETED
|
&& s != ERestoreState::COMPLETED
|
||||||
|
@ -314,8 +333,6 @@ public:
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
UID getUid() { return uid; }
|
|
||||||
|
|
||||||
static Future<std::string> getProgress_impl(RestoreConfig const &restore, Reference<ReadYourWritesTransaction> const &tr);
|
static Future<std::string> getProgress_impl(RestoreConfig const &restore, Reference<ReadYourWritesTransaction> const &tr);
|
||||||
Future<std::string> getProgress(Reference<ReadYourWritesTransaction> tr) {
|
Future<std::string> getProgress(Reference<ReadYourWritesTransaction> tr) {
|
||||||
return getProgress_impl(*this, tr);
|
return getProgress_impl(*this, tr);
|
||||||
|
@ -325,10 +342,6 @@ public:
|
||||||
Future<std::string> getFullStatus(Reference<ReadYourWritesTransaction> tr) {
|
Future<std::string> getFullStatus(Reference<ReadYourWritesTransaction> tr) {
|
||||||
return getFullStatus_impl(*this, tr);
|
return getFullStatus_impl(*this, tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
UID uid;
|
|
||||||
Subspace configSpace;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ACTOR Future<std::string> RestoreConfig::getProgress_impl(RestoreConfig restore, Reference<ReadYourWritesTransaction> tr) {
|
ACTOR Future<std::string> RestoreConfig::getProgress_impl(RestoreConfig restore, Reference<ReadYourWritesTransaction> tr) {
|
||||||
|
|
Loading…
Reference in New Issue