Add new version window requirement to reference impl

This commit is contained in:
2024-07-02 12:42:03 -07:00
parent 68ab9a9f08
commit 0be97a34b6

View File

@@ -467,13 +467,15 @@ inline uint32_t Arbitrary::bounded(uint32_t s) {
// ==================== END ARBITRARY IMPL ==================== // ==================== END ARBITRARY IMPL ====================
struct ReferenceImpl { struct ReferenceImpl {
explicit ReferenceImpl(int64_t oldestVersion) : oldestVersion(oldestVersion) { explicit ReferenceImpl(int64_t oldestVersion)
: oldestVersion(oldestVersion), newestVersion(oldestVersion) {
writeVersionMap[""] = oldestVersion; writeVersionMap[""] = oldestVersion;
} }
void check(const ConflictSet::ReadRange *reads, ConflictSet::Result *results, void check(const ConflictSet::ReadRange *reads, ConflictSet::Result *results,
int count) const { int count) const {
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
if (reads[i].readVersion < oldestVersion) { if (reads[i].readVersion < oldestVersion ||
reads[i].readVersion < newestVersion - 2e9) {
results[i] = ConflictSet::TooOld; results[i] = ConflictSet::TooOld;
continue; continue;
} }
@@ -495,6 +497,8 @@ struct ReferenceImpl {
} }
void addWrites(const ConflictSet::WriteRange *writes, int count, void addWrites(const ConflictSet::WriteRange *writes, int count,
int64_t writeVersion) { int64_t writeVersion) {
assert(writeVersion >= newestVersion);
newestVersion = writeVersion;
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
auto begin = auto begin =
std::string((const char *)writes[i].begin.p, writes[i].begin.len); std::string((const char *)writes[i].begin.p, writes[i].begin.len);
@@ -519,6 +523,7 @@ struct ReferenceImpl {
} }
int64_t oldestVersion; int64_t oldestVersion;
int64_t newestVersion;
std::map<std::string, int64_t> writeVersionMap; std::map<std::string, int64_t> writeVersionMap;
}; };
@@ -600,7 +605,7 @@ template <class ConflictSetImpl> struct TestDriver {
{ {
int numPointWrites = arbitrary.bounded(100); int numPointWrites = arbitrary.bounded(100);
int numRangeWrites = arbitrary.bounded(100); int numRangeWrites = arbitrary.bounded(100);
int64_t v = (writeVersion += arbitrary.bounded(10)); int64_t v = (writeVersion += arbitrary.bounded(2e9));
auto *writes = auto *writes =
new (arena) ConflictSet::WriteRange[numPointWrites + numRangeWrites]; new (arena) ConflictSet::WriteRange[numPointWrites + numRangeWrites];
auto keys = set<std::string_view>(arena); auto keys = set<std::string_view>(arena);
@@ -642,18 +647,19 @@ template <class ConflictSetImpl> struct TestDriver {
} }
#if DEBUG_VERBOSE && !defined(NDEBUG) #if DEBUG_VERBOSE && !defined(NDEBUG)
if (writes[i].end.len == 0) { if (writes[i].end.len == 0) {
fprintf(stderr, "Write: {%s} -> %" PRId64 "\n", fprintf(stderr, "Write: {%s}\n", printable(writes[i].begin).c_str());
printable(writes[i].begin).c_str(), writeVersion);
} else { } else {
fprintf(stderr, "Write: [%s, %s) -> %" PRId64 "\n", fprintf(stderr, "Write: [%s, %s)\n",
printable(writes[i].begin).c_str(), printable(writes[i].begin).c_str(),
printable(writes[i].end).c_str(), writeVersion); printable(writes[i].end).c_str());
} }
#endif #endif
} }
assert(iter == keys.end()); assert(iter == keys.end());
assert(i == numPointWrites + numRangeWrites); assert(i == numPointWrites + numRangeWrites);
fprintf(stderr, "Write @ %" PRId64 "\n", v);
CALLGRIND_START_INSTRUMENTATION; CALLGRIND_START_INSTRUMENTATION;
cs.addWrites(writes, numPointWrites + numRangeWrites, v); cs.addWrites(writes, numPointWrites + numRangeWrites, v);
CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_STOP_INSTRUMENTATION;