Implement several more PaxosConfigTransaction methods

This commit is contained in:
sfc-gh-tclinkenbeard 2021-07-18 14:21:21 -07:00
parent de871da75f
commit 91e6b7d83d
2 changed files with 65 additions and 11 deletions

View File

@ -58,6 +58,39 @@ class PaxosConfigTransactionImpl {
} }
} }
ACTOR static Future<RangeResult> getConfigClasses(PaxosConfigTransactionImpl* self) {
if (!self->getGenerationFuture.isValid()) {
self->getGenerationFuture = getGeneration(self);
}
ConfigGeneration generation = wait(self->getGenerationFuture);
// TODO: Load balance
ConfigTransactionGetConfigClassesReply reply =
wait(self->ctis[0].getClasses.getReply(ConfigTransactionGetConfigClassesRequest{ generation }));
RangeResult result;
result.reserve(result.arena(), reply.configClasses.size());
for (const auto& configClass : reply.configClasses) {
result.push_back_deep(result.arena(), KeyValueRef(configClass, ""_sr));
}
return result;
}
ACTOR static Future<Standalone<RangeResultRef>> getKnobs(PaxosConfigTransactionImpl* self,
Optional<Key> configClass) {
if (!self->getGenerationFuture.isValid()) {
self->getGenerationFuture = getGeneration(self);
}
ConfigGeneration generation = wait(self->getGenerationFuture);
// TODO: Load balance
ConfigTransactionGetKnobsReply reply =
wait(self->ctis[0].getKnobs.getReply(ConfigTransactionGetKnobsRequest{ generation, configClass }));
RangeResult result;
result.reserve(result.arena(), reply.knobNames.size());
for (const auto& knobName : reply.knobNames) {
result.push_back_deep(result.arena(), KeyValueRef(knobName, ""_sr));
}
return result;
}
public: public:
Future<Version> getReadVersion() { Future<Version> getReadVersion() {
if (!getGenerationFuture.isValid()) { if (!getGenerationFuture.isValid()) {
@ -84,6 +117,19 @@ public:
Future<Optional<Value>> get(Key const& key) { return get(this, key); } Future<Optional<Value>> get(Key const& key) { return get(this, key); }
Future<RangeResult> getRange(KeyRangeRef keys) {
if (keys == configClassKeys) {
return getConfigClasses(this);
} else if (keys == globalConfigKnobKeys) {
return getKnobs(this, {});
} else if (configKnobKeys.contains(keys) && keys.singleKeyRange()) {
const auto configClass = keys.begin.removePrefix(configKnobKeys.begin);
return getKnobs(this, configClass);
} else {
throw invalid_config_db_range_read();
}
}
Future<Void> onError(Error const& e) { Future<Void> onError(Error const& e) {
// TODO: Improve this: // TODO: Improve this:
if (e.code() == error_code_transaction_too_old) { if (e.code() == error_code_transaction_too_old) {
@ -139,14 +185,15 @@ Future<Optional<Value>> PaxosConfigTransaction::get(Key const& key, Snapshot) {
return impl().get(key); return impl().get(key);
} }
Future<Standalone<RangeResultRef>> PaxosConfigTransaction::getRange(KeySelector const& begin, Future<RangeResult> PaxosConfigTransaction::getRange(KeySelector const& begin,
KeySelector const& end, KeySelector const& end,
int limit, int limit,
Snapshot snapshot, Snapshot snapshot,
Reverse reverse) { Reverse reverse) {
// TODO: Implement if (reverse) {
ASSERT(false); throw client_invalid_operation();
return Standalone<RangeResultRef>{}; }
return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey()));
} }
Future<Standalone<RangeResultRef>> PaxosConfigTransaction::getRange(KeySelector begin, Future<Standalone<RangeResultRef>> PaxosConfigTransaction::getRange(KeySelector begin,
@ -154,9 +201,10 @@ Future<Standalone<RangeResultRef>> PaxosConfigTransaction::getRange(KeySelector
GetRangeLimits limits, GetRangeLimits limits,
Snapshot snapshot, Snapshot snapshot,
Reverse reverse) { Reverse reverse) {
// TODO: Implement if (reverse) {
ASSERT(false); throw client_invalid_operation();
return Standalone<RangeResultRef>{}; }
return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey()));
} }
void PaxosConfigTransaction::set(KeyRef const& key, ValueRef const& value) { void PaxosConfigTransaction::set(KeyRef const& key, ValueRef const& value) {

View File

@ -215,6 +215,9 @@ Future<Standalone<RangeResultRef>> SimpleConfigTransaction::getRange(KeySelector
int limit, int limit,
Snapshot snapshot, Snapshot snapshot,
Reverse reverse) { Reverse reverse) {
if (reverse) {
throw client_invalid_operation();
}
return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey())); return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey()));
} }
@ -223,6 +226,9 @@ Future<Standalone<RangeResultRef>> SimpleConfigTransaction::getRange(KeySelector
GetRangeLimits limits, GetRangeLimits limits,
Snapshot snapshot, Snapshot snapshot,
Reverse reverse) { Reverse reverse) {
if (reverse) {
throw client_invalid_operation();
}
return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey())); return impl().getRange(KeyRangeRef(begin.getKey(), end.getKey()));
} }