Compare commits
3 Commits
25cc427ec5
...
b0085df5ad
Author | SHA1 | Date | |
---|---|---|---|
b0085df5ad | |||
76a7e17b29 | |||
5cf43d1bfa |
@@ -39,6 +39,8 @@ limitations under the License.
|
|||||||
|
|
||||||
#include <memcheck.h>
|
#include <memcheck.h>
|
||||||
|
|
||||||
|
using namespace weaselab;
|
||||||
|
|
||||||
// Use assert for checking potentially complex properties during tests.
|
// Use assert for checking potentially complex properties during tests.
|
||||||
// Use assume to hint simple properties to the optimizer.
|
// Use assume to hint simple properties to the optimizer.
|
||||||
|
|
||||||
|
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include "ConflictSet.h"
|
#include "ConflictSet.h"
|
||||||
|
|
||||||
|
using namespace weaselab;
|
||||||
|
|
||||||
#include <bit>
|
#include <bit>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <compare>
|
#include <compare>
|
||||||
|
36
README.md
36
README.md
@@ -33,25 +33,25 @@ Performance counters:
|
|||||||
## Radix tree (this implementation)
|
## Radix tree (this implementation)
|
||||||
|
|
||||||
```
|
```
|
||||||
New conflict set: 1.285 sec
|
New conflict set: 1.660 sec
|
||||||
0.973 Mtransactions/sec
|
0.753 Mtransactions/sec
|
||||||
3.892 Mkeys/sec
|
3.012 Mkeys/sec
|
||||||
Detect only: 1.196 sec
|
Detect only: 1.524 sec
|
||||||
1.045 Mtransactions/sec
|
0.820 Mtransactions/sec
|
||||||
4.180 Mkeys/sec
|
3.280 Mkeys/sec
|
||||||
Skiplist only: 0.539 sec
|
Skiplist only: 0.844 sec
|
||||||
2.320 Mtransactions/sec
|
1.481 Mtransactions/sec
|
||||||
9.281 Mkeys/sec
|
5.926 Mkeys/sec
|
||||||
Performance counters:
|
Performance counters:
|
||||||
Build: 0.0377
|
Build: 0.0699
|
||||||
Add: 0.0493
|
Add: 0.0628
|
||||||
Detect: 1.2
|
Detect: 1.52
|
||||||
D.Sort: 0.41
|
D.Sort: 0.435
|
||||||
D.Combine: 0.0135
|
D.Combine: 0.0183
|
||||||
D.CheckRead: 0.219
|
D.CheckRead: 0.37
|
||||||
D.CheckIntraBatch: 0.00654
|
D.CheckIntraBatch: 0.00801
|
||||||
D.MergeWrite: 0.319
|
D.MergeWrite: 0.473
|
||||||
D.RemoveBefore: 0.224
|
D.RemoveBefore: 0.215
|
||||||
```
|
```
|
||||||
|
|
||||||
# Our benchmark
|
# Our benchmark
|
||||||
|
@@ -8,6 +8,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace weaselab;
|
||||||
|
|
||||||
double now() {
|
double now() {
|
||||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
std::chrono::steady_clock::now().time_since_epoch())
|
std::chrono::steady_clock::now().time_since_epoch())
|
||||||
|
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
using namespace weaselab;
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
ConflictSet cs(0);
|
ConflictSet cs(0);
|
||||||
ConflictSet::WriteRange w;
|
ConflictSet::WriteRange w;
|
||||||
|
107
fdb-patch.txt
107
fdb-patch.txt
@@ -1,32 +1,19 @@
|
|||||||
giff --git a/fdbserver/CMakeLists.txt b/fdbserver/CMakeLists.txt
|
diff --git a/fdbserver/CMakeLists.txt b/fdbserver/CMakeLists.txt
|
||||||
index 3f353c2ef..cd0834761 100644
|
index 3f353c2ef..074a18628 100644
|
||||||
--- a/fdbserver/CMakeLists.txt
|
--- a/fdbserver/CMakeLists.txt
|
||||||
+++ b/fdbserver/CMakeLists.txt
|
+++ b/fdbserver/CMakeLists.txt
|
||||||
@@ -22,6 +22,9 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/workloads)
|
@@ -22,6 +22,9 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/workloads)
|
||||||
|
|
||||||
add_flow_target(EXECUTABLE NAME fdbserver SRCS ${FDBSERVER_SRCS})
|
add_flow_target(EXECUTABLE NAME fdbserver SRCS ${FDBSERVER_SRCS})
|
||||||
|
|
||||||
+find_package(ConflictSet)
|
+find_package(conflict-set)
|
||||||
+target_link_libraries(fdbserver PRIVATE conflict_set_static)
|
+target_link_libraries(fdbserver PRIVATE conflict-set-static)
|
||||||
+
|
+
|
||||||
if (WITH_SWIFT)
|
if (WITH_SWIFT)
|
||||||
# Setup the Swift sources in FDBServer.
|
# Setup the Swift sources in FDBServer.
|
||||||
include(FindSwiftLibs)
|
include(FindSwiftLibs)
|
||||||
diff --git a/fdbserver/Resolver.actor.cpp b/fdbserver/Resolver.actor.cpp
|
|
||||||
index bf4118f5f..d3b4eaad8 100644
|
|
||||||
--- a/fdbserver/Resolver.actor.cpp
|
|
||||||
+++ b/fdbserver/Resolver.actor.cpp
|
|
||||||
@@ -132,7 +132,7 @@ struct Resolver : ReferenceCounted<Resolver> {
|
|
||||||
AsyncVar<int64_t> totalStateBytes;
|
|
||||||
AsyncTrigger checkNeededVersion;
|
|
||||||
std::map<NetworkAddress, ProxyRequestsInfo> proxyInfoMap;
|
|
||||||
- ConflictSet* conflictSet;
|
|
||||||
+ ConflictSet2* conflictSet;
|
|
||||||
TransientStorageMetricSample iopsSample;
|
|
||||||
|
|
||||||
// Use LogSystem as backend for txnStateStore. However, the real commit
|
|
||||||
diff --git a/fdbserver/SkipList.cpp b/fdbserver/SkipList.cpp
|
diff --git a/fdbserver/SkipList.cpp b/fdbserver/SkipList.cpp
|
||||||
index b48d32c6b..da106b5d2 100644
|
index b48d32c6b..da99e03aa 100644
|
||||||
--- a/fdbserver/SkipList.cpp
|
--- a/fdbserver/SkipList.cpp
|
||||||
+++ b/fdbserver/SkipList.cpp
|
+++ b/fdbserver/SkipList.cpp
|
||||||
@@ -25,6 +25,7 @@
|
@@ -25,6 +25,7 @@
|
||||||
@@ -46,50 +33,35 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
static std::vector<PerfDoubleCounter*> skc;
|
static std::vector<PerfDoubleCounter*> skc;
|
||||||
|
|
||||||
static thread_local uint32_t g_seed = 0;
|
static thread_local uint32_t g_seed = 0;
|
||||||
@@ -782,26 +785,34 @@ private:
|
@@ -783,10 +786,14 @@ private:
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
-struct ConflictSet {
|
struct ConflictSet {
|
||||||
- ConflictSet() : removalKey(makeString(0)), oldestVersion(0) {}
|
- ConflictSet() : removalKey(makeString(0)), oldestVersion(0) {}
|
||||||
- ~ConflictSet() {}
|
+ ConflictSet() : versionHistory(0), removalKey(makeString(0)), oldestVersion(0) {}
|
||||||
+struct ConflictSet2 {
|
~ConflictSet() {}
|
||||||
+ ConflictSet2() : versionHistory(0), removalKey(makeString(0)), oldestVersion(0) {}
|
|
||||||
+ ~ConflictSet2() {}
|
|
||||||
|
|
||||||
+#if USE_RADIX_TREE
|
+#if USE_RADIX_TREE
|
||||||
+ ConflictSet versionHistory;
|
+ weaselab::ConflictSet versionHistory;
|
||||||
+#else
|
+#else
|
||||||
SkipList versionHistory;
|
SkipList versionHistory;
|
||||||
+#endif
|
+#endif
|
||||||
Key removalKey;
|
Key removalKey;
|
||||||
Version oldestVersion;
|
Version oldestVersion;
|
||||||
};
|
};
|
||||||
|
@@ -795,7 +802,11 @@ ConflictSet* newConflictSet() {
|
||||||
-ConflictSet* newConflictSet() {
|
return new ConflictSet;
|
||||||
- return new ConflictSet;
|
|
||||||
+ConflictSet2* newConflictSet() {
|
|
||||||
+ return new ConflictSet2;
|
|
||||||
}
|
}
|
||||||
-void clearConflictSet(ConflictSet* cs, Version v) {
|
void clearConflictSet(ConflictSet* cs, Version v) {
|
||||||
- SkipList(v).swap(cs->versionHistory);
|
- SkipList(v).swap(cs->versionHistory);
|
||||||
+void clearConflictSet(ConflictSet2* cs, Version v) {
|
|
||||||
+#if USE_RADIX_TREE
|
+#if USE_RADIX_TREE
|
||||||
+ cs->versionHistory = ConflictSet{ 0 };
|
+ cs->versionHistory = weaselab::ConflictSet{ 0 };
|
||||||
+#else
|
+#else
|
||||||
+ SkipList().swap(cs->versionHistory);
|
+ SkipList().swap(cs->versionHistory);
|
||||||
+#endif
|
+#endif
|
||||||
}
|
}
|
||||||
-void destroyConflictSet(ConflictSet* cs) {
|
void destroyConflictSet(ConflictSet* cs) {
|
||||||
+void destroyConflictSet(ConflictSet2* cs) {
|
|
||||||
delete cs;
|
delete cs;
|
||||||
}
|
|
||||||
|
|
||||||
-ConflictBatch::ConflictBatch(ConflictSet* cs,
|
|
||||||
+ConflictBatch::ConflictBatch(ConflictSet2* cs,
|
|
||||||
std::map<int, VectorRef<int>>* conflictingKeyRangeMap,
|
|
||||||
Arena* resolveBatchReplyArena)
|
|
||||||
: cs(cs), transactionCount(0), conflictingKeyRangeMap(conflictingKeyRangeMap),
|
|
||||||
@@ -971,11 +982,15 @@ void ConflictBatch::detectConflicts(Version now,
|
@@ -971,11 +982,15 @@ void ConflictBatch::detectConflicts(Version now,
|
||||||
t = timer();
|
t = timer();
|
||||||
if (newOldestVersion > cs->oldestVersion) {
|
if (newOldestVersion > cs->oldestVersion) {
|
||||||
@@ -112,7 +84,7 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
|
|
||||||
+#if USE_RADIX_TREE
|
+#if USE_RADIX_TREE
|
||||||
+ Arena arena;
|
+ Arena arena;
|
||||||
+ auto* reads = new (arena) ConflictSet::ReadRange[combinedReadConflictRanges.size()];
|
+ auto* reads = new (arena) weaselab::ConflictSet::ReadRange[combinedReadConflictRanges.size()];
|
||||||
+
|
+
|
||||||
+ for (int i = 0; i < combinedReadConflictRanges.size(); ++i) {
|
+ for (int i = 0; i < combinedReadConflictRanges.size(); ++i) {
|
||||||
+ auto& read = reads[i];
|
+ auto& read = reads[i];
|
||||||
@@ -122,11 +94,11 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
+ read.end.p = combinedReadConflictRanges[i].end.begin();
|
+ read.end.p = combinedReadConflictRanges[i].end.begin();
|
||||||
+ read.end.len = combinedReadConflictRanges[i].end.size();
|
+ read.end.len = combinedReadConflictRanges[i].end.size();
|
||||||
+ }
|
+ }
|
||||||
+ auto* results = new (arena) ConflictSet::Result[combinedReadConflictRanges.size()];
|
+ auto* results = new (arena) weaselab::ConflictSet::Result[combinedReadConflictRanges.size()];
|
||||||
+ cs->versionHistory.check(reads, results, combinedReadConflictRanges.size());
|
+ cs->versionHistory.check(reads, results, combinedReadConflictRanges.size());
|
||||||
+
|
+
|
||||||
+ for (int i = 0; i < combinedReadConflictRanges.size(); ++i) {
|
+ for (int i = 0; i < combinedReadConflictRanges.size(); ++i) {
|
||||||
+ if (results[i] == ConflictSet::Conflict) {
|
+ if (results[i] == weaselab::ConflictSet::Conflict) {
|
||||||
+ transactionConflictStatus[combinedReadConflictRanges[i].transaction] = true;
|
+ transactionConflictStatus[combinedReadConflictRanges[i].transaction] = true;
|
||||||
+ if (combinedReadConflictRanges[i].conflictingKeyRange != nullptr) {
|
+ if (combinedReadConflictRanges[i].conflictingKeyRange != nullptr) {
|
||||||
+ combinedReadConflictRanges[i].conflictingKeyRange->push_back(*combinedReadConflictRanges[i].cKRArena,
|
+ combinedReadConflictRanges[i].conflictingKeyRange->push_back(*combinedReadConflictRanges[i].cKRArena,
|
||||||
@@ -147,7 +119,7 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
|
|
||||||
+#if USE_RADIX_TREE
|
+#if USE_RADIX_TREE
|
||||||
+ Arena arena;
|
+ Arena arena;
|
||||||
+ auto* writes = new (arena) ConflictSet::WriteRange[combinedWriteConflictRanges.size()];
|
+ auto* writes = new (arena) weaselab::ConflictSet::WriteRange[combinedWriteConflictRanges.size()];
|
||||||
+
|
+
|
||||||
+ for (int i = 0; i < combinedWriteConflictRanges.size(); ++i) {
|
+ for (int i = 0; i < combinedWriteConflictRanges.size(); ++i) {
|
||||||
+ auto& write = writes[i];
|
+ auto& write = writes[i];
|
||||||
@@ -164,15 +136,6 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ConflictBatch::combineWriteConflictRanges() {
|
void ConflictBatch::combineWriteConflictRanges() {
|
||||||
@@ -1115,7 +1171,7 @@ void skipListTest() {
|
|
||||||
|
|
||||||
double start;
|
|
||||||
|
|
||||||
- ConflictSet* cs = newConflictSet();
|
|
||||||
+ ConflictSet2* cs = newConflictSet();
|
|
||||||
|
|
||||||
Arena testDataArena;
|
|
||||||
VectorRef<VectorRef<KeyRangeRef>> testData;
|
|
||||||
@@ -1197,6 +1253,4 @@ void skipListTest() {
|
@@ -1197,6 +1253,4 @@ void skipListTest() {
|
||||||
for (const auto& counter : skc) {
|
for (const auto& counter : skc) {
|
||||||
printf("%20s: %s\n", counter->getMetric().name().c_str(), counter->getMetric().formatted().c_str());
|
printf("%20s: %s\n", counter->getMetric().name().c_str(), counter->getMetric().formatted().c_str());
|
||||||
@@ -180,35 +143,3 @@ index b48d32c6b..da106b5d2 100644
|
|||||||
-
|
-
|
||||||
- printf("%d entries in version history\n", cs->versionHistory.count());
|
- printf("%d entries in version history\n", cs->versionHistory.count());
|
||||||
}
|
}
|
||||||
diff --git a/fdbserver/include/fdbserver/ConflictSet.h b/fdbserver/include/fdbserver/ConflictSet.h
|
|
||||||
index 90ed2c406..b7e31217c 100644
|
|
||||||
--- a/fdbserver/include/fdbserver/ConflictSet.h
|
|
||||||
+++ b/fdbserver/include/fdbserver/ConflictSet.h
|
|
||||||
@@ -28,13 +28,13 @@
|
|
||||||
#include "fdbclient/CommitTransaction.h"
|
|
||||||
#include "fdbserver/ResolverBug.h"
|
|
||||||
|
|
||||||
-struct ConflictSet;
|
|
||||||
-ConflictSet* newConflictSet();
|
|
||||||
-void clearConflictSet(ConflictSet*, Version);
|
|
||||||
-void destroyConflictSet(ConflictSet*);
|
|
||||||
+struct ConflictSet2;
|
|
||||||
+ConflictSet2* newConflictSet();
|
|
||||||
+void clearConflictSet(ConflictSet2*, Version);
|
|
||||||
+void destroyConflictSet(ConflictSet2*);
|
|
||||||
|
|
||||||
struct ConflictBatch {
|
|
||||||
- explicit ConflictBatch(ConflictSet*,
|
|
||||||
+ explicit ConflictBatch(ConflictSet2*,
|
|
||||||
std::map<int, VectorRef<int>>* conflictingKeyRangeMap = nullptr,
|
|
||||||
Arena* resolveBatchReplyArena = nullptr);
|
|
||||||
~ConflictBatch();
|
|
||||||
@@ -54,7 +54,7 @@ struct ConflictBatch {
|
|
||||||
void GetTooOldTransactions(std::vector<int>& tooOldTransactions);
|
|
||||||
|
|
||||||
private:
|
|
||||||
- ConflictSet* cs;
|
|
||||||
+ ConflictSet2* cs;
|
|
||||||
Standalone<VectorRef<struct TransactionInfo*>> transactionInfo;
|
|
||||||
std::vector<struct KeyInfo> points;
|
|
||||||
int transactionCount;
|
|
||||||
|
@@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
namespace weaselab {
|
||||||
/** A data structure for optimistic concurrency control on ranges of
|
/** A data structure for optimistic concurrency control on ranges of
|
||||||
* bitwise-lexicographically-ordered keys.
|
* bitwise-lexicographically-ordered keys.
|
||||||
*
|
*
|
||||||
@@ -100,6 +101,7 @@ struct __attribute__((__visibility__("default"))) ConflictSet {
|
|||||||
private:
|
private:
|
||||||
Impl *impl;
|
Impl *impl;
|
||||||
};
|
};
|
||||||
|
} /* namespace weaselab */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
22
symbols.txt
22
symbols.txt
@@ -4,14 +4,14 @@ ConflictSet_create
|
|||||||
ConflictSet_destroy
|
ConflictSet_destroy
|
||||||
ConflictSet_getBytes
|
ConflictSet_getBytes
|
||||||
ConflictSet_setOldestVersion
|
ConflictSet_setOldestVersion
|
||||||
_ZN11ConflictSet16setOldestVersionEl
|
_ZN8weaselab11ConflictSet16setOldestVersionEl
|
||||||
_ZN11ConflictSet9addWritesEPKNS_10WriteRangeEil
|
_ZN8weaselab11ConflictSet9addWritesEPKNS0_10WriteRangeEil
|
||||||
_ZN11ConflictSetaSEOS_
|
_ZN8weaselab11ConflictSetaSEOS0_
|
||||||
_ZN11ConflictSetC1El
|
_ZN8weaselab11ConflictSetC1El
|
||||||
_ZN11ConflictSetC1EOS_
|
_ZN8weaselab11ConflictSetC1EOS0_
|
||||||
_ZN11ConflictSetC2El
|
_ZN8weaselab11ConflictSetC2El
|
||||||
_ZN11ConflictSetC2EOS_
|
_ZN8weaselab11ConflictSetC2EOS0_
|
||||||
_ZN11ConflictSetD1Ev
|
_ZN8weaselab11ConflictSetD1Ev
|
||||||
_ZN11ConflictSetD2Ev
|
_ZN8weaselab11ConflictSetD2Ev
|
||||||
_ZNK11ConflictSet5checkEPKNS_9ReadRangeEPNS_6ResultEi
|
_ZNK8weaselab11ConflictSet5checkEPKNS0_9ReadRangeEPNS0_6ResultEi
|
||||||
_ZNK11ConflictSet8getBytesEv
|
_ZNK8weaselab11ConflictSet8getBytesEv
|
||||||
|
Reference in New Issue
Block a user