6 Commits

Author SHA1 Message Date
83c7f66d67 Remove some redundant nullptr checks
All checks were successful
Tests / Clang total: 825, passed: 825
Clang |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc] total: 825, passed: 825
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 824, passed: 824
Tests / Coverage total: 823, passed: 823
weaselab/conflict-set/pipeline/head This commit looks good
2024-03-18 16:22:24 -07:00
a5710b8282 Remove performance-only code from debug build for increased coverage 2024-03-18 16:21:55 -07:00
c31eebd5de No caller of CheckRangeRightSide::downLeftSpine has null n 2024-03-18 16:03:41 -07:00
ddeb059968 Remove more dead code 2024-03-18 16:01:56 -07:00
5a0bcf9a5a Strengthen precondition to checkRangeStartsWith
and remove resulting dead code
2024-03-18 15:44:44 -07:00
97717cec86 Remove suspected dead code
Removing it is definitely safe. I suspect that any way to get here would
have already returned from checkRangeRead during the search for the
common prefix
2024-03-18 15:30:15 -07:00
335 changed files with 50 additions and 56 deletions

View File

@@ -1672,7 +1672,10 @@ Vector<uint8_t> getSearchPath(Arena &arena, Node *n) {
} // GCOVR_EXCL_LINE } // GCOVR_EXCL_LINE
// Return true if the max version among all keys that start with key + [child], // Return true if the max version among all keys that start with key + [child],
// where begin < child < end, is <= readVersion // where begin < child < end, is <= readVersion.
//
// Precondition: transitively, no child of n has a search path that's a longer
// prefix of key than n
bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin, bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin,
int end, int64_t readVersion, int end, int64_t readVersion,
ConflictSet::Impl *impl) { ConflictSet::Impl *impl) {
@@ -1680,56 +1683,51 @@ bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin,
fprintf(stderr, "%s(%02x,%02x)*\n", printable(key).c_str(), begin, end); fprintf(stderr, "%s(%02x,%02x)*\n", printable(key).c_str(), begin, end);
#endif #endif
auto remaining = key; auto remaining = key;
for (;;) { if (remaining.size() == 0) {
if (maxVersion(n, impl) <= readVersion) { return maxBetweenExclusive(n, begin, end) <= readVersion;
return true; }
}
if (remaining.size() == 0) {
return maxBetweenExclusive(n, begin, end) <= readVersion;
}
auto *child = getChild(n, remaining[0]); auto *child = getChild(n, remaining[0]);
if (child == nullptr) { if (child == nullptr) {
int c = getChildGeq(n, remaining[0]); int c = getChildGeq(n, remaining[0]);
if (c >= 0) { if (c >= 0) {
n = getChildExists(n, c); n = getChildExists(n, c);
goto downLeftSpine;
} else {
n = nextSibling(n);
goto downLeftSpine;
}
}
n = child;
remaining = remaining.subspan(1, remaining.size() - 1);
assert(n->partialKeyLen > 0);
{
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen);
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine; goto downLeftSpine;
} else { } else {
n = nextSibling(n); n = nextSibling(n);
goto downLeftSpine; goto downLeftSpine;
} }
} }
assert(n->partialKeyLen > int(remaining.size()));
n = child; if (begin < n->partialKey()[remaining.size()] &&
remaining = remaining.subspan(1, remaining.size() - 1); n->partialKey()[remaining.size()] < end) {
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
if (n->partialKeyLen > 0) { return false;
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen);
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
} else {
n = nextSibling(n);
goto downLeftSpine;
}
}
if (commonLen == n->partialKeyLen) {
// partial key matches
remaining = remaining.subspan(commonLen, remaining.size() - commonLen);
} else if (n->partialKeyLen > int(remaining.size())) {
if (begin < n->partialKey()[remaining.size()] &&
n->partialKey()[remaining.size()] < end) {
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
return false;
}
return maxVersion(n, impl) <= readVersion;
}
return true;
} }
return maxVersion(n, impl) <= readVersion;
} }
return true;
} }
__builtin_unreachable(); // GCOVR_EXCL_LINE
downLeftSpine: downLeftSpine:
if (n == nullptr) { if (n == nullptr) {
return true; return true;
@@ -1836,9 +1834,7 @@ struct CheckRangeLeftSide {
remaining = remaining =
remaining.subspan(commonLen, remaining.size() - commonLen); remaining.subspan(commonLen, remaining.size() - commonLen);
} else if (n->partialKeyLen > int(remaining.size())) { } else if (n->partialKeyLen > int(remaining.size())) {
if (searchPathLen < prefixLen) { assert(searchPathLen >= prefixLen);
return downLeftSpine();
}
if (n->entryPresent && n->entry.rangeVersion > readVersion) { if (n->entryPresent && n->entry.rangeVersion > readVersion) {
ok = false; ok = false;
return true; return true;
@@ -2017,10 +2013,7 @@ struct CheckRangeRightSide {
bool downLeftSpine() { bool downLeftSpine() {
phase = DownLeftSpine; phase = DownLeftSpine;
if (n == nullptr) { assert(n != nullptr);
ok = true;
return true;
}
return false; return false;
} }
}; };
@@ -2356,6 +2349,9 @@ Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
goto downLeftSpine; goto downLeftSpine;
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) {
return {nullptr, 1};
}
goto downLeftSpine; goto downLeftSpine;
} }
} }
@@ -2386,9 +2382,6 @@ Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
} }
} }
downLeftSpine: downLeftSpine:
if (n == nullptr) {
return {nullptr, 1};
}
for (;;) { for (;;) {
if (n->entryPresent) { if (n->entryPresent) {
return {n, 1}; return {n, 1};
@@ -2438,9 +2431,14 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
return; return;
} }
this->oldestVersion = oldestVersion; this->oldestVersion = oldestVersion;
#ifdef NDEBUG
// This is here for performance reasons, since we want to amortize the cost
// of storing the search path as a string. In tests, we want to exercise the
// rest of the code often.
if (keyUpdates < 100) { if (keyUpdates < 100) {
return; return;
} }
#endif
Node *n = firstGeq(root, removalKey).n; Node *n = firstGeq(root, removalKey).n;
// There's no way to erase removalKey without introducing a key after it // There's no way to erase removalKey without introducing a key after it
assert(n != nullptr); assert(n != nullptr);
@@ -2468,9 +2466,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
removalKey = {}; removalKey = {};
return; return;
} }
if (keyUpdates == 0) {
keyUpdates = 10;
}
removalKeyArena = Arena(); removalKeyArena = Arena();
removalKey = getSearchPath(removalKeyArena, n); removalKey = getSearchPath(removalKeyArena, n);
} }
@@ -2511,7 +2506,7 @@ int64_t &maxVersion(Node *n, ConflictSet::Impl *impl) {
return impl->rootMaxVersion; return impl->rootMaxVersion;
} }
switch (n->getType()) { switch (n->getType()) {
case Type_Node0: case Type_Node0: // GCOVR_EXCL_LINE
__builtin_unreachable(); // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE
case Type_Node3: { case Type_Node3: {
auto *n3 = static_cast<Node3 *>(n); auto *n3 = static_cast<Node3 *>(n);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More