forked from weaselab/conflict-set
Compare commits
6
Commits
6db080a34c
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
46d1f05333 | ||
|
|
8a16f9a6d6 | ||
|
|
9a2c64d31c | ||
|
|
ec1b476977 | ||
|
|
8c55e835c4 | ||
|
|
af76c4d623 |
+4
-3
@@ -2135,7 +2135,8 @@ inline uint8x16_t conflictMask16(const InternalVersionT *vs,
|
|||||||
int32x2_t r32[8];
|
int32x2_t r32[8];
|
||||||
const auto *vsp = reinterpret_cast<const int64_t *>(vs);
|
const auto *vsp = reinterpret_cast<const int64_t *>(vs);
|
||||||
for (int j = 0; j < 8; ++j) {
|
for (int j = 0; j < 8; ++j) {
|
||||||
r32[j] = vmovn_s64(vcgtq_s64(vld1q_s64(vsp + 2 * j), rvVec));
|
r32[j] = vmovn_s64(
|
||||||
|
vreinterpretq_s64_u64(vcgtq_s64(vld1q_s64(vsp + 2 * j), rvVec)));
|
||||||
}
|
}
|
||||||
uint32x4_t w4[4];
|
uint32x4_t w4[4];
|
||||||
for (int k = 0; k < 4; ++k) {
|
for (int k = 0; k < 4; ++k) {
|
||||||
@@ -4980,7 +4981,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
}
|
}
|
||||||
if (e != nullptr) {
|
if (e != nullptr) {
|
||||||
while (e->releaseDeferred) {
|
while (e->releaseDeferred) {
|
||||||
e = b->forwardTo;
|
e = e->forwardTo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr, "search path: %s, begin: %s\n",
|
fprintf(stderr, "search path: %s, begin: %s\n",
|
||||||
@@ -5090,7 +5091,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
|
|
||||||
if (oldestExtantVersion < writeVersion - kMaxCorrectVersionWindow)
|
if (oldestExtantVersion < writeVersion - kMaxCorrectVersionWindow)
|
||||||
[[unlikely]] {
|
[[unlikely]] {
|
||||||
if (writeVersion > newestVersionFullPrecision + kNominalVersionWindow) {
|
if (writeVersion - kNominalVersionWindow > newestVersionFullPrecision) {
|
||||||
eraseTree(rootParent->children[0], &writeContext);
|
eraseTree(rootParent->children[0], &writeContext);
|
||||||
init(writeVersion - kNominalVersionWindow);
|
init(writeVersion - kNominalVersionWindow);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
using namespace weaselab;
|
using namespace weaselab;
|
||||||
|
|
||||||
@@ -23,6 +24,28 @@ int main(void) {
|
|||||||
int64_t bytes = cs.getBytes();
|
int64_t bytes = cs.getBytes();
|
||||||
assert(bytes > 0);
|
assert(bytes > 0);
|
||||||
|
|
||||||
|
// Regression: a write just below INT64_MAX must not overflow the nominal
|
||||||
|
// version window comparison and erase entries that reads still observe.
|
||||||
|
// Versions are only required to be >= 0, so this is valid input.
|
||||||
|
{
|
||||||
|
const int64_t imax = std::numeric_limits<int64_t>::max();
|
||||||
|
const int64_t v0 = imax - int64_t(1000000000);
|
||||||
|
ConflictSet nearMax(0);
|
||||||
|
ConflictSet::WriteRange w2;
|
||||||
|
w2.begin.p = (const uint8_t *)"key";
|
||||||
|
w2.begin.len = 3;
|
||||||
|
w2.end.len = 0;
|
||||||
|
nearMax.addWrites(&w2, 1, v0);
|
||||||
|
nearMax.addWrites(&w2, 0, imax);
|
||||||
|
ConflictSet::ReadRange r2;
|
||||||
|
r2.begin.p = (const uint8_t *)"key";
|
||||||
|
r2.begin.len = 3;
|
||||||
|
r2.end.len = 0;
|
||||||
|
r2.readVersion = v0 - 1;
|
||||||
|
nearMax.check(&r2, &result, 1);
|
||||||
|
assert(result == ConflictSet::Conflict);
|
||||||
|
}
|
||||||
|
|
||||||
ConflictSet::MetricsV1 *metrics;
|
ConflictSet::MetricsV1 *metrics;
|
||||||
int metricsCount;
|
int metricsCount;
|
||||||
cs.getMetricsV1(&metrics, &metricsCount);
|
cs.getMetricsV1(&metrics, &metricsCount);
|
||||||
|
|||||||
Reference in New Issue
Block a user