1
0
mirror of https://github.com/apple/foundationdb.git synced 2025-05-31 01:37:54 +08:00

Fix a couple bugs. Don't store old versions in tenant map indefinitely.

This commit is contained in:
A.J. Beamon 2022-03-02 10:13:31 -08:00
parent c630cb45cd
commit b4feddea8d
2 changed files with 9 additions and 3 deletions

@ -81,6 +81,6 @@ public:
};
typedef VersionedMap<TenantName, TenantMapEntry> TenantMap;
typedef VersionedMap<KeyRef, TenantNameRef> TenantPrefixIndex;
typedef VersionedMap<Key, TenantName> TenantPrefixIndex;
#endif

@ -2964,7 +2964,7 @@ TEST_CASE("/fdbserver/storageserver/constructMappedKey") {
.append("{...}"_sr);
bool isRangeQuery = false;
Key mappedKey = constructMappedKey(&kvr, mapperTuple, isRangeQuery, "foo"_sr);
Key mappedKey = constructMappedKey(&kvr, mapperTuple, isRangeQuery, TenantMapEntry(1, "foo"_sr).prefix);
Key expectedMappedKey = Tuple()
.append("normal"_sr)
@ -5831,11 +5831,17 @@ ACTOR Future<Void> updateStorage(StorageServer* data) {
state double beforeStorageUpdates = now();
loop {
state bool done = data->storage.makeVersionMutationsDurable(newOldestVersion, desiredVersion, bytesLeft);
if (data->tenantMap.getLatestVersion() < newOldestVersion) {
data->tenantMap.createNewVersion(newOldestVersion);
data->tenantPrefixIndex.createNewVersion(newOldestVersion);
}
// We want to forget things from these data structures atomically with changing oldestVersion (and "before",
// since oldestVersion.set() may trigger waiting actors) forgetVersionsBeforeAsync visibly forgets
// immediately (without waiting) but asynchronously frees memory.
Future<Void> finishedForgetting =
data->mutableData().forgetVersionsBeforeAsync(newOldestVersion, TaskPriority::UpdateStorage);
data->mutableData().forgetVersionsBeforeAsync(newOldestVersion, TaskPriority::UpdateStorage) &&
data->tenantMap.forgetVersionsBeforeAsync(newOldestVersion, TaskPriority::UpdateStorage) &&
data->tenantPrefixIndex.forgetVersionsBeforeAsync(newOldestVersion, TaskPriority::UpdateStorage);
data->oldestVersion.set(newOldestVersion);
wait(finishedForgetting);
wait(yield(TaskPriority::UpdateStorage));