Interface change! Return TooOld after 2e9 versions

Event if setOldestVersion wasn't called
This commit is contained in:
2024-06-30 15:25:44 -07:00
parent 8e3eacb54f
commit a68ad5dd17
4 changed files with 34 additions and 4 deletions

View File

@@ -2765,7 +2765,9 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
auto begin = std::span<const uint8_t>(r.begin.p, r.begin.len);
auto end = std::span<const uint8_t>(r.end.p, r.end.len);
result[i] =
InternalVersionT(reads[i].readVersion) < oldestVersion ? TooOld
InternalVersionT(reads[i].readVersion) < oldestVersion ||
reads[i].readVersion < newestVersionFullPrecision - 2e9
? TooOld
: (end.size() > 0
? checkRangeRead(root, begin, end,
InternalVersionT(reads[i].readVersion), this)
@@ -2777,6 +2779,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
}
void addWrites(const WriteRange *writes, int count, int64_t writeVersion) {
assert(writeVersion >= newestVersionFullPrecision);
newestVersionFullPrecision = writeVersion;
#if INTERNAL_VERSION_32_BIT
InternalVersionT::zero = oldestVersion;
#endif
@@ -2798,6 +2802,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
void setOldestVersion(int64_t o) {
InternalVersionT oldestVersion{o};
assert(o >= oldestVersionFullPrecision);
this->oldestVersionFullPrecision = o;
this->oldestVersion = oldestVersion;
#if INTERNAL_VERSION_32_BIT
InternalVersionT::zero = oldestVersion;
@@ -2841,7 +2847,9 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
}
}
explicit Impl(int64_t oldestVersion) : oldestVersion(oldestVersion) {
explicit Impl(int64_t oldestVersion)
: oldestVersion(oldestVersion), oldestVersionFullPrecision(oldestVersion),
newestVersionFullPrecision(oldestVersion) {
#if DEBUG_VERBOSE
fprintf(stderr, "radix_tree: create\n");
#endif
@@ -2876,6 +2884,11 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
Node *root;
InternalVersionT rootMaxVersion;
InternalVersionT oldestVersion;
// TODO this doesn't fully mitigate the 32-bit precision issue, since we still
// need to make sure we clean up versions in the tree before they fall out of
// the 2e9 window.
int64_t oldestVersionFullPrecision;
int64_t newestVersionFullPrecision;
int64_t totalBytes = 0;
};