Rework check metrics
All checks were successful
Tests / Clang total: 1533, passed: 1533
Clang |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Debug total: 1531, passed: 1531
Tests / SIMD fallback total: 1533, passed: 1533
Tests / Release [gcc] total: 1533, passed: 1533
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 1144, passed: 1144
Tests / Coverage total: 1151, passed: 1151
Code Coverage #### Project Overview No changes detected, that affect the code coverage. * Line Coverage: 98.72% (1693/1715) * Branch Coverage: 64.63% (1502/2324) * Complexity Density: 0.00 * Lines of Code: 1715 #### Quality Gates Summary Output truncated.
weaselab/conflict-set/pipeline/head This commit looks good

{point,prefix,range} x {count,iterations,short_circuits} + node scans
This commit is contained in:
2024-07-15 14:02:39 -07:00
parent c39af9117f
commit ffd1dfe74d

View File

@@ -1711,23 +1711,31 @@ struct SearchStepWise {
}
};
thread_local double accume_point_read = 0;
thread_local double accume_prefix_read = 0;
thread_local double accume_range_read = 0;
thread_local double accume_max_between = 0;
thread_local double point_read_accum = 0;
thread_local double prefix_read_accum = 0;
thread_local double range_read_accum = 0;
thread_local double point_read_short_circuit_accum = 0;
thread_local double prefix_read_short_circuit_accum = 0;
thread_local double range_read_short_circuit_accum = 0;
thread_local double point_read_iterations_accum = 0;
thread_local double prefix_read_iterations_accum = 0;
thread_local double range_read_iterations_accum = 0;
thread_local double range_read_node_scan_accum = 0;
// Logically this is the same as performing firstGeq and then checking against
// point or range version according to cmp, but this version short circuits as
// soon as it can prove that there's no conflict.
bool checkPointRead(Node *n, const std::span<const uint8_t> key,
InternalVersionT readVersion, ConflictSet::Impl *impl) {
++accume_point_read;
++point_read_accum;
#if DEBUG_VERBOSE && !defined(NDEBUG)
fprintf(stderr, "Check point read: %s\n", printable(key).c_str());
#endif
auto remaining = key;
for (;;) {
++point_read_iterations_accum;
if (maxVersion(n, impl) <= readVersion) {
++point_read_short_circuit_accum;
return true;
}
if (remaining.size() == 0) {
@@ -1799,18 +1807,20 @@ downLeftSpine:
// short circuits as soon as it can prove that there's no conflict.
bool checkPrefixRead(Node *n, const std::span<const uint8_t> key,
InternalVersionT readVersion, ConflictSet::Impl *impl) {
++accume_prefix_read;
++prefix_read_accum;
#if DEBUG_VERBOSE && !defined(NDEBUG)
fprintf(stderr, "Check prefix read: %s\n", printable(key).c_str());
#endif
auto remaining = key;
for (;;) {
++prefix_read_iterations_accum;
auto m = maxVersion(n, impl);
if (remaining.size() == 0) {
return m <= readVersion;
}
if (m <= readVersion) {
++prefix_read_short_circuit_accum;
return true;
}
@@ -2041,7 +2051,7 @@ scan16(const InternalVersionT *vs, int begin, int end,
template <bool kAVX512>
bool checkMaxBetweenExclusive(Node *n, int begin, int end,
InternalVersionT readVersion) {
++accume_max_between;
++range_read_node_scan_accum;
assume(-1 <= begin);
assume(begin <= 256);
assume(-1 <= end);
@@ -2639,7 +2649,7 @@ template <bool kAVX512>
bool checkRangeReadImpl(Node *n, std::span<const uint8_t> begin,
std::span<const uint8_t> end,
InternalVersionT readVersion, ConflictSet::Impl *impl) {
++accume_range_read;
++range_read_accum;
int lcp = longestCommonPrefix(begin.data(), end.data(),
std::min(begin.size(), end.size()));
if (lcp == int(begin.size()) && end.size() == begin.size() + 1 &&
@@ -2654,10 +2664,12 @@ bool checkRangeReadImpl(Node *n, std::span<const uint8_t> begin,
SearchStepWise search{n, begin.subspan(0, lcp)};
Arena arena;
for (;;) {
++range_read_iterations_accum;
assert(getSearchPath(arena, search.n) <=>
begin.subspan(0, lcp - search.remaining.size()) ==
0);
if (maxVersion(search.n, impl) <= readVersion) {
++range_read_short_circuit_accum;
return true;
}
if (search.step()) {
@@ -2696,20 +2708,24 @@ bool checkRangeReadImpl(Node *n, std::span<const uint8_t> begin,
for (;;) {
bool leftDone = checkRangeLeftSide.step();
++range_read_iterations_accum;
bool rightDone = checkRangeRightSide.step();
++range_read_iterations_accum;
if (!leftDone && !rightDone) {
continue;
}
if (leftDone && rightDone) {
break;
} else if (leftDone) {
while (!checkRangeRightSide.step())
;
while (!checkRangeRightSide.step()) {
++range_read_iterations_accum;
}
break;
} else {
assert(rightDone);
while (!checkRangeLeftSide.step())
;
while (!checkRangeLeftSide.step()) {
++range_read_iterations_accum;
}
}
break;
}
@@ -3057,10 +3073,9 @@ Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
void check(const ReadRange *reads, Result *result, int count) {
assert(accume_point_read == 0);
assert(accume_prefix_read == 0);
assert(accume_range_read == 0);
assert(accume_max_between == 0);
int commits_accum = 0;
int conflicts_accum = 0;
int too_olds_accum = 0;
for (int i = 0; i < count; ++i) {
const auto &r = reads[i];
auto begin = std::span<const uint8_t>(r.begin.p, r.begin.len);
@@ -3076,11 +3091,30 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
InternalVersionT(reads[i].readVersion), this))
? Commit
: Conflict;
commits_accum += result[i] == Commit;
conflicts_accum += result[i] == Conflict;
too_olds_accum += result[i] == TooOld;
}
read_point_total.add(std::exchange(accume_point_read, 0));
read_prefix_total.add(std::exchange(accume_prefix_read, 0));
read_range_total.add(std::exchange(accume_range_read, 0));
read_range_node_total.add(std::exchange(accume_max_between, 0));
point_read_total.add(std::exchange(point_read_accum, 0));
prefix_read_total.add(std::exchange(prefix_read_accum, 0));
range_read_total.add(std::exchange(range_read_accum, 0));
range_read_node_scan_total.add(
std::exchange(range_read_node_scan_accum, 0));
point_read_short_circuit_total.add(
std::exchange(point_read_short_circuit_accum, 0));
prefix_read_short_circuit_total.add(
std::exchange(prefix_read_short_circuit_accum, 0));
range_read_short_circuit_total.add(
std::exchange(range_read_short_circuit_accum, 0));
point_read_iterations_total.add(
std::exchange(point_read_iterations_accum, 0));
prefix_read_iterations_total.add(
std::exchange(prefix_read_iterations_accum, 0));
range_read_iterations_total.add(
std::exchange(range_read_iterations_accum, 0));
commits_total.add(commits_accum);
conflicts_total.add(conflicts_accum);
too_olds_total.add(too_olds_accum);
}
void addWrites(const WriteRange *writes, int count, int64_t writeVersion) {
@@ -3266,13 +3300,34 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
#define COUNTER(name, help) \
Counter name { this, #name, help }
// ==================== METRICS DEFINITIONS ====================
GAUGE(memory_bytes, "Total number of bytes in use.");
COUNTER(read_point_total, "Total number of point reads checked.");
COUNTER(read_prefix_total, "Total number of prefix reads checked.");
COUNTER(read_range_total, "Total number of range reads checked.");
COUNTER(read_range_node_total,
"Total number of range checks of individual nodes while "
"checking a range read.");
GAUGE(memory_bytes, "Total number of bytes in use");
COUNTER(point_read_total, "Total number of point reads checked");
COUNTER(point_read_short_circuit_total,
"Total number of point reads that did not require a full search to "
"check");
COUNTER(point_read_iterations_total,
"Total number of iterations of the main loop for point read checks");
COUNTER(prefix_read_total, "Total number of prefix reads checked");
COUNTER(prefix_read_short_circuit_total,
"Total number of prefix reads that did not require a full search to "
"check");
COUNTER(prefix_read_iterations_total,
"Total number of iterations of the main loop for prefix read checks");
COUNTER(range_read_total, "Total number of range reads checked");
COUNTER(range_read_short_circuit_total,
"Total number of range reads that did not require a full search to "
"check");
COUNTER(range_read_iterations_total,
"Total number of iterations of the main loops for range read checks");
COUNTER(range_read_node_scan_total,
"Total number of scans of individual nodes while "
"checking a range read");
COUNTER(commits_total,
"Total number of checks where the result is \"commit\"");
COUNTER(conflicts_total,
"Total number of checks where the result is \"conflict\"");
COUNTER(too_olds_total,
"Total number of checks where the result is \"too old\"");
// ==================== END METRICS DEFINITIONS ====================
#undef GAUGE
#undef COUNTER