diff --git a/ServerBench.cpp b/ServerBench.cpp index 1f57675..b081b82 100644 --- a/ServerBench.cpp +++ b/ServerBench.cpp @@ -64,31 +64,47 @@ template std::string tupleKey(const Ts &...ts) { return result; } -constexpr int kWindowSize = 300000; +constexpr int kTotalKeyRange = 1'000'000'000; +constexpr int kWindowSize = 1'000'000; +constexpr int kNumKeys = 10; void workload(weaselab::ConflictSet *cs) { int64_t version = kWindowSize; - constexpr int kNumWrites = 16; for (;; transactions.fetch_add(1, std::memory_order_relaxed)) { std::vector keyIndices; - for (int i = 0; i < kNumWrites; ++i) { - keyIndices.push_back(rand() % 100'000'000); + for (int i = 0; i < kNumKeys; ++i) { + keyIndices.push_back(rand() % kTotalKeyRange); } std::sort(keyIndices.begin(), keyIndices.end()); std::vector keys; - std::vector writes; - constexpr std::string_view suffix = "this is a suffix"; - for (int i = 0; i < kNumWrites; ++i) { - keys.push_back(tupleKey(0x100, i, keyIndices[i], - suffix.substr(0, rand() % suffix.size()), - rand())); + constexpr std::string_view fullString = + "this is a string, where a prefix of it is used as an element of the " + "tuple forming the key"; + for (int i = 0; i < kNumKeys; ++i) { + keys.push_back( + tupleKey(0x100, keyIndices[i] / fullString.size(), + fullString.substr(0, keyIndices[i] % fullString.size()))); // printf("%s\n", printable(keys.back()).c_str()); } - for (int i = 0; i < kNumWrites; ++i) { + + std::vector reads; + std::vector writes; + std::vector results; + for (int i = 0; i < kNumKeys; ++i) { writes.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())}, {nullptr, 0}}); + reads.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())}, + {nullptr, 0}, + version - kWindowSize}); } - cs->addWrites(writes.data(), writes.size(), version); + results.resize(reads.size()); + + cs->check(reads.data(), results.data(), reads.size()); + bool ok = true; + for (auto result : results) { + ok &= result == weaselab::ConflictSet::Commit; + } + cs->addWrites(writes.data(), ok ? writes.size() : 0, version); cs->setOldestVersion(version - kWindowSize); ++version; }