mirror of
https://github.com/apple/foundationdb.git
synced 2025-06-01 18:56:00 +08:00
Merge pull request #7496 from sfc-gh-ajbeamon/refactor-tenant-map-encoding
Refactor how tenant map entries are encoded and decoded
This commit is contained in:
commit
76a147a104
@ -1404,17 +1404,6 @@ BlobWorkerInterface decodeBlobWorkerListValue(ValueRef const& value) {
|
||||
return interf;
|
||||
}
|
||||
|
||||
Value encodeTenantEntry(TenantMapEntry const& tenantEntry) {
|
||||
return ObjectWriter::toValue(tenantEntry, IncludeVersion());
|
||||
}
|
||||
|
||||
TenantMapEntry decodeTenantEntry(ValueRef const& value) {
|
||||
TenantMapEntry entry;
|
||||
ObjectReader reader(value.begin(), IncludeVersion());
|
||||
reader.deserialize(entry);
|
||||
return entry;
|
||||
}
|
||||
|
||||
const KeyRangeRef tenantMapKeys("\xff/tenantMap/"_sr, "\xff/tenantMap0"_sr);
|
||||
const KeyRef tenantMapPrefix = tenantMapKeys.begin;
|
||||
const KeyRef tenantMapPrivatePrefix = "\xff\xff/tenantMap/"_sr;
|
||||
|
@ -54,12 +54,12 @@ TenantMapEntry::TenantMapEntry(int64_t id, KeyRef subspace) : id(id) {
|
||||
TEST_CASE("/fdbclient/TenantMapEntry/Serialization") {
|
||||
TenantMapEntry entry1(1, ""_sr);
|
||||
ASSERT(entry1.prefix == "\x00\x00\x00\x00\x00\x00\x00\x01"_sr);
|
||||
TenantMapEntry entry2 = decodeTenantEntry(encodeTenantEntry(entry1));
|
||||
TenantMapEntry entry2 = TenantMapEntry::decode(entry1.encode());
|
||||
ASSERT(entry1.id == entry2.id && entry1.prefix == entry2.prefix);
|
||||
|
||||
TenantMapEntry entry3(std::numeric_limits<int64_t>::max(), "foo"_sr);
|
||||
ASSERT(entry3.prefix == "foo\x7f\xff\xff\xff\xff\xff\xff\xff"_sr);
|
||||
TenantMapEntry entry4 = decodeTenantEntry(encodeTenantEntry(entry3));
|
||||
TenantMapEntry entry4 = TenantMapEntry::decode(entry3.encode());
|
||||
ASSERT(entry3.id == entry4.id && entry3.prefix == entry4.prefix);
|
||||
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
@ -78,7 +78,7 @@ TEST_CASE("/fdbclient/TenantMapEntry/Serialization") {
|
||||
entry.prefix.endsWith(StringRef(reinterpret_cast<uint8_t*>(&bigEndianId), 8)) &&
|
||||
entry.prefix.size() == subspaceLength + 8);
|
||||
|
||||
TenantMapEntry decodedEntry = decodeTenantEntry(encodeTenantEntry(entry));
|
||||
TenantMapEntry decodedEntry = TenantMapEntry::decode(entry.encode());
|
||||
ASSERT(decodedEntry.id == entry.id && decodedEntry.prefix == entry.prefix);
|
||||
}
|
||||
|
||||
|
@ -631,9 +631,6 @@ extern const KeyRef tenantMapPrivatePrefix;
|
||||
extern const KeyRef tenantLastIdKey;
|
||||
extern const KeyRef tenantDataPrefixKey;
|
||||
|
||||
Value encodeTenantEntry(TenantMapEntry const& tenantEntry);
|
||||
TenantMapEntry decodeTenantEntry(ValueRef const& value);
|
||||
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
#endif
|
||||
|
@ -47,6 +47,15 @@ public:
|
||||
TenantMapEntry();
|
||||
TenantMapEntry(int64_t id, KeyRef subspace);
|
||||
|
||||
Value encode() const { return ObjectWriter::toValue(*this, IncludeVersion(ProtocolVersion::withTenants())); }
|
||||
|
||||
static TenantMapEntry decode(ValueRef const& value) {
|
||||
TenantMapEntry entry;
|
||||
ObjectReader reader(value.begin(), IncludeVersion(ProtocolVersion::withTenants()));
|
||||
reader.deserialize(entry);
|
||||
return entry;
|
||||
}
|
||||
|
||||
template <class Ar>
|
||||
void serialize(Ar& ar) {
|
||||
KeyRef subspace;
|
||||
|
@ -40,7 +40,7 @@ Future<Optional<TenantMapEntry>> tryGetTenantTransaction(Transaction tr, TenantN
|
||||
|
||||
state typename transaction_future_type<Transaction, Optional<Value>>::type tenantFuture = tr->get(tenantMapKey);
|
||||
Optional<Value> val = wait(safeThreadFutureToFuture(tenantFuture));
|
||||
return val.map<TenantMapEntry>([](Optional<Value> v) { return decodeTenantEntry(v.get()); });
|
||||
return val.map<TenantMapEntry>([](Optional<Value> v) { return TenantMapEntry::decode(v.get()); });
|
||||
}
|
||||
|
||||
ACTOR template <class DB>
|
||||
@ -130,7 +130,7 @@ Future<std::pair<TenantMapEntry, bool>> createTenantTransaction(Transaction tr,
|
||||
throw tenant_prefix_allocator_conflict();
|
||||
}
|
||||
|
||||
tr->set(tenantMapKey, encodeTenantEntry(newTenant));
|
||||
tr->set(tenantMapKey, newTenant.encode());
|
||||
|
||||
return std::make_pair(newTenant, true);
|
||||
}
|
||||
@ -260,7 +260,7 @@ Future<std::map<TenantName, TenantMapEntry>> listTenantsTransaction(Transaction
|
||||
|
||||
std::map<TenantName, TenantMapEntry> tenants;
|
||||
for (auto kv : results) {
|
||||
tenants[kv.key.removePrefix(tenantMapPrefix)] = decodeTenantEntry(kv.value);
|
||||
tenants[kv.key.removePrefix(tenantMapPrefix)] = TenantMapEntry::decode(kv.value);
|
||||
}
|
||||
|
||||
return tenants;
|
||||
|
@ -654,7 +654,7 @@ private:
|
||||
if (tenantMap) {
|
||||
ASSERT(version != invalidVersion);
|
||||
TenantName tenantName = m.param1.removePrefix(tenantMapPrefix);
|
||||
TenantMapEntry tenantEntry = decodeTenantEntry(m.param2);
|
||||
TenantMapEntry tenantEntry = TenantMapEntry::decode(m.param2);
|
||||
|
||||
TraceEvent("CommitProxyInsertTenant", dbgid).detail("Tenant", tenantName).detail("Version", version);
|
||||
(*tenantMap)[tenantName] = tenantEntry;
|
||||
|
@ -845,7 +845,7 @@ ACTOR Future<Void> monitorClientRanges(Reference<BlobManagerData> bmData) {
|
||||
std::vector<Key> prefixes;
|
||||
for (auto& it : tenantResults) {
|
||||
TenantNameRef tenantName = it.key.removePrefix(tenantMapPrefix);
|
||||
TenantMapEntry entry = decodeTenantEntry(it.value);
|
||||
TenantMapEntry entry = TenantMapEntry::decode(it.value);
|
||||
tenants.push_back(std::pair(tenantName, entry));
|
||||
prefixes.push_back(entry.prefix);
|
||||
}
|
||||
|
@ -3198,7 +3198,7 @@ ACTOR Future<Void> monitorTenants(Reference<BlobWorkerData> bwData) {
|
||||
for (auto& it : tenantResults) {
|
||||
// FIXME: handle removing/moving tenants!
|
||||
TenantNameRef tenantName = it.key.removePrefix(tenantMapPrefix);
|
||||
TenantMapEntry entry = decodeTenantEntry(it.value);
|
||||
TenantMapEntry entry = TenantMapEntry::decode(it.value);
|
||||
tenants.push_back(std::pair(tenantName, entry));
|
||||
}
|
||||
bwData->tenantData.addTenants(tenants);
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
|
||||
for (int i = 0; i < tenantList.size(); i++) {
|
||||
TenantName tname = tenantList[i].key.removePrefix(tenantMapPrefix);
|
||||
TenantMapEntry t = decodeTenantEntry(tenantList[i].value);
|
||||
TenantMapEntry t = TenantMapEntry::decode(tenantList[i].value);
|
||||
|
||||
tenantCache->insert(tname, t);
|
||||
|
||||
@ -86,7 +86,7 @@ public:
|
||||
|
||||
for (int i = 0; i < tenantList.size(); i++) {
|
||||
TenantName tname = tenantList[i].key.removePrefix(tenantMapPrefix);
|
||||
TenantMapEntry t = decodeTenantEntry(tenantList[i].value);
|
||||
TenantMapEntry t = TenantMapEntry::decode(tenantList[i].value);
|
||||
|
||||
if (tenantCache->update(tname, t)) {
|
||||
tenantListUpdated = true;
|
||||
|
@ -6948,7 +6948,7 @@ void StorageServer::insertTenant(TenantNameRef tenantName,
|
||||
tenantMap.createNewVersion(version);
|
||||
tenantPrefixIndex.createNewVersion(version);
|
||||
|
||||
TenantMapEntry tenantEntry = decodeTenantEntry(value);
|
||||
TenantMapEntry tenantEntry = TenantMapEntry::decode(value);
|
||||
|
||||
tenantMap.insert(tenantName, tenantEntry);
|
||||
tenantPrefixIndex.insert(tenantEntry.prefix, tenantName);
|
||||
@ -7829,7 +7829,7 @@ void StorageServerDisk::makeNewStorageServerDurable() {
|
||||
|
||||
auto view = data->tenantMap.atLatest();
|
||||
for (auto itr = view.begin(); itr != view.end(); ++itr) {
|
||||
storage->set(KeyValueRef(itr.key().withPrefix(persistTenantMapKeys.begin), encodeTenantEntry(*itr)));
|
||||
storage->set(KeyValueRef(itr.key().withPrefix(persistTenantMapKeys.begin), itr->encode()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -8310,7 +8310,7 @@ ACTOR Future<bool> restoreDurableState(StorageServer* data, IKeyValueStore* stor
|
||||
for (tenantMapLoc = 0; tenantMapLoc < tenantMap.size(); tenantMapLoc++) {
|
||||
auto const& result = tenantMap[tenantMapLoc];
|
||||
TenantName tenantName = result.key.substr(persistTenantMapKeys.begin.size());
|
||||
TenantMapEntry tenantEntry = decodeTenantEntry(result.value);
|
||||
TenantMapEntry tenantEntry = TenantMapEntry::decode(result.value);
|
||||
|
||||
data->tenantMap.insert(tenantName, tenantEntry);
|
||||
data->tenantPrefixIndex.insert(tenantEntry.prefix, tenantName);
|
||||
|
Loading…
x
Reference in New Issue
Block a user