foundationdb/fdbclient/SimpleConfigTransaction.act...

140 lines
3.9 KiB
C++
Raw Normal View History

2021-04-15 13:06:37 +08:00
/*
* SimpleConfigTransaction.actor.cpp
2021-04-15 13:06:37 +08:00
*
* This source file is part of the FoundationDB open source project
*
* Copyright 2013-2018 Apple Inc. and the FoundationDB project authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <algorithm>
#include "fdbclient/IConfigTransaction.h"
2021-04-15 13:06:37 +08:00
#include "fdbclient/CommitTransaction.h"
#include "flow/Arena.h"
#include "flow/actorcompiler.h" // This must be the last #include.
class SimpleConfigTransactionImpl {
Standalone<VectorRef<MutationRef>> mutations;
2021-04-15 13:06:37 +08:00
Future<Version> version;
ConfigTransactionInterface cti;
int numRetries{ 0 };
2021-04-15 13:06:37 +08:00
ACTOR static Future<Version> getVersion(SimpleConfigTransactionImpl* self) {
ConfigTransactionGetVersionRequest req;
ConfigTransactionGetVersionReply reply =
wait(self->cti.getVersion.getReply(ConfigTransactionGetVersionRequest{}));
2021-04-15 13:06:37 +08:00
return reply.version;
}
ACTOR static Future<Optional<Value>> get(SimpleConfigTransactionImpl* self, KeyRef key) {
2021-04-15 13:06:37 +08:00
if (!self->version.isValid()) {
self->version = getVersion(self);
}
Version version = wait(self->version);
ConfigTransactionGetReply result = wait(self->cti.get.getReply(ConfigTransactionGetRequest(version, key)));
2021-04-15 13:06:37 +08:00
return result.value;
}
ACTOR static Future<Void> commit(SimpleConfigTransactionImpl* self) {
2021-04-15 13:06:37 +08:00
if (!self->version.isValid()) {
self->version = getVersion(self);
}
Version version = wait(self->version);
wait(self->cti.commit.getReply(ConfigTransactionCommitRequest(version, self->mutations)));
2021-04-15 13:06:37 +08:00
return Void();
}
public:
SimpleConfigTransactionImpl(ClusterConnectionString const& ccs) {
2021-04-15 13:06:37 +08:00
auto coordinators = ccs.coordinators();
std::sort(coordinators.begin(), coordinators.end());
cti = ConfigTransactionInterface(coordinators[0]);
2021-04-15 13:06:37 +08:00
}
void set(KeyRef key, ValueRef value) {
mutations.emplace_back_deep(mutations.arena(), MutationRef::Type::SetValue, key, value);
}
2021-04-15 13:06:37 +08:00
void clearRange(KeyRef begin, KeyRef end) {
mutations.emplace_back_deep(mutations.arena(), MutationRef::Type::ClearRange, begin, end);
2021-04-15 13:06:37 +08:00
}
Future<Optional<Value>> get(KeyRef key) { return get(this, key); }
Future<Void> commit() { return commit(this); }
Future<Void> onError(Error const& e) {
// TODO: Improve this:
if (e.code() == error_code_transaction_too_old) {
reset();
return delay((1 << numRetries++) * 0.01 * deterministicRandom()->random01());
}
throw e;
}
Future<Version> getVersion() {
if (!version.isValid())
version = getVersion(this);
return version;
}
void reset() {
version = Future<Version>{};
mutations = Standalone<VectorRef<MutationRef>>{};
}
void fullReset() {
numRetries = 0;
reset();
}
2021-04-15 13:06:37 +08:00
};
void SimpleConfigTransaction::set(KeyRef key, ValueRef value) {
2021-04-15 13:06:37 +08:00
impl->set(key, value);
}
void SimpleConfigTransaction::clearRange(KeyRef begin, KeyRef end) {
2021-04-15 13:06:37 +08:00
impl->clearRange(begin, end);
}
Future<Optional<Value>> SimpleConfigTransaction::get(KeyRef key) {
2021-04-15 13:06:37 +08:00
return impl->get(key);
}
Future<Void> SimpleConfigTransaction::commit() {
2021-04-15 13:06:37 +08:00
return impl->commit();
}
Future<Void> SimpleConfigTransaction::onError(Error const& e) {
2021-04-15 13:06:37 +08:00
return impl->onError(e);
}
Future<Version> SimpleConfigTransaction::getVersion() {
return impl->getVersion();
}
void SimpleConfigTransaction::reset() {
return impl->reset();
}
void SimpleConfigTransaction::fullReset() {
return impl->reset();
}
SimpleConfigTransaction::SimpleConfigTransaction(ClusterConnectionString const& ccs)
: impl(std::make_unique<SimpleConfigTransactionImpl>(ccs)) {}
2021-04-15 13:06:37 +08:00
SimpleConfigTransaction::~SimpleConfigTransaction() = default;