Add done_common_prefix_iter
This commit is contained in:
@@ -2671,19 +2671,7 @@ downLeftSpine:
|
|||||||
|
|
||||||
bool finishCheckRangeRead(int lcp, Node *n, std::span<const uint8_t> begin,
|
bool finishCheckRangeRead(int lcp, Node *n, std::span<const uint8_t> begin,
|
||||||
std::span<const uint8_t> end,
|
std::span<const uint8_t> end,
|
||||||
std::span<const uint8_t> commonPrefixRemaining,
|
|
||||||
InternalVersionT readVersion, ReadContext *tls) {
|
InternalVersionT readVersion, ReadContext *tls) {
|
||||||
Arena arena;
|
|
||||||
assert(getSearchPath(arena, n) <=>
|
|
||||||
begin.subspan(0, lcp - commonPrefixRemaining.size()) ==
|
|
||||||
0);
|
|
||||||
|
|
||||||
const int consumed = lcp - commonPrefixRemaining.size();
|
|
||||||
assume(consumed >= 0);
|
|
||||||
|
|
||||||
begin = begin.subspan(consumed, int(begin.size()) - consumed);
|
|
||||||
end = end.subspan(consumed, int(end.size()) - consumed);
|
|
||||||
lcp -= consumed;
|
|
||||||
|
|
||||||
if (lcp == int(begin.size())) {
|
if (lcp == int(begin.size())) {
|
||||||
return checkRangeRightSide(n, end, lcp, readVersion, tls);
|
return checkRangeRightSide(n, end, lcp, readVersion, tls);
|
||||||
@@ -3376,7 +3364,7 @@ FLATTEN PRESERVE_NONE void begin(CheckJob *, CheckContext *);
|
|||||||
template <class NodeT>
|
template <class NodeT>
|
||||||
FLATTEN PRESERVE_NONE void common_prefix_iter(CheckJob *, CheckContext *);
|
FLATTEN PRESERVE_NONE void common_prefix_iter(CheckJob *, CheckContext *);
|
||||||
|
|
||||||
FLATTEN PRESERVE_NONE void down_left_spine(CheckJob *, CheckContext *);
|
FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *, CheckContext *);
|
||||||
|
|
||||||
static Continuation commonPrefixIterTable[] = {
|
static Continuation commonPrefixIterTable[] = {
|
||||||
common_prefix_iter<Node0>, common_prefix_iter<Node3>,
|
common_prefix_iter<Node0>, common_prefix_iter<Node3>,
|
||||||
@@ -3404,23 +3392,13 @@ FLATTEN PRESERVE_NONE void begin(CheckJob *job, CheckContext *context) {
|
|||||||
job->commonPrefixRemaining = job->begin.subspan(0, job->lcp);
|
job->commonPrefixRemaining = job->begin.subspan(0, job->lcp);
|
||||||
|
|
||||||
if (job->commonPrefixRemaining.size() == 0) {
|
if (job->commonPrefixRemaining.size() == 0) {
|
||||||
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end,
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
job->commonPrefixRemaining,
|
|
||||||
job->readVersion, context->tls)
|
|
||||||
? ConflictSet::Commit
|
|
||||||
: ConflictSet::Conflict;
|
|
||||||
MUSTTAIL return complete(job, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto c = getChild(job->n, job->commonPrefixRemaining[0]);
|
auto c = getChild(job->n, job->commonPrefixRemaining[0]);
|
||||||
job->child = c;
|
job->child = c;
|
||||||
if (job->child == nullptr) {
|
if (job->child == nullptr) {
|
||||||
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end,
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
job->commonPrefixRemaining,
|
|
||||||
job->readVersion, context->tls)
|
|
||||||
? ConflictSet::Commit
|
|
||||||
: ConflictSet::Conflict;
|
|
||||||
MUSTTAIL return complete(job, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
job->continuation = commonPrefixIterTable[c.getType()];
|
job->continuation = commonPrefixIterTable[c.getType()];
|
||||||
@@ -3441,12 +3419,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
|||||||
int i = longestCommonPrefix(child->partialKey(),
|
int i = longestCommonPrefix(child->partialKey(),
|
||||||
job->commonPrefixRemaining.data() + 1, cl);
|
job->commonPrefixRemaining.data() + 1, cl);
|
||||||
if (i != child->partialKeyLen) {
|
if (i != child->partialKeyLen) {
|
||||||
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin,
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
job->end, job->commonPrefixRemaining,
|
|
||||||
job->readVersion, context->tls)
|
|
||||||
? ConflictSet::Commit
|
|
||||||
: ConflictSet::Conflict;
|
|
||||||
MUSTTAIL return complete(job, context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
job->n = job->child;
|
job->n = job->child;
|
||||||
@@ -3457,23 +3430,13 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
|||||||
++context->tls->range_read_iterations_accum;
|
++context->tls->range_read_iterations_accum;
|
||||||
|
|
||||||
if (job->commonPrefixRemaining.size() == 0) {
|
if (job->commonPrefixRemaining.size() == 0) {
|
||||||
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end,
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
job->commonPrefixRemaining,
|
|
||||||
job->readVersion, context->tls)
|
|
||||||
? ConflictSet::Commit
|
|
||||||
: ConflictSet::Conflict;
|
|
||||||
MUSTTAIL return complete(job, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto c = getChild(job->n, job->commonPrefixRemaining[0]);
|
auto c = getChild(job->n, job->commonPrefixRemaining[0]);
|
||||||
job->child = c;
|
job->child = c;
|
||||||
if (job->child == nullptr) {
|
if (job->child == nullptr) {
|
||||||
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end,
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
job->commonPrefixRemaining,
|
|
||||||
job->readVersion, context->tls)
|
|
||||||
? ConflictSet::Commit
|
|
||||||
: ConflictSet::Conflict;
|
|
||||||
MUSTTAIL return complete(job, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
job->continuation = commonPrefixIterTable[c.getType()];
|
job->continuation = commonPrefixIterTable[c.getType()];
|
||||||
@@ -3481,6 +3444,31 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
|||||||
MUSTTAIL return keepGoing(job, context);
|
MUSTTAIL return keepGoing(job, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *job,
|
||||||
|
CheckContext *context) {
|
||||||
|
|
||||||
|
{
|
||||||
|
Arena arena;
|
||||||
|
assert(getSearchPath(arena, job->n) <=>
|
||||||
|
job->begin.subspan(0, job->lcp -
|
||||||
|
job->commonPrefixRemaining.size()) ==
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int consumed = job->lcp - job->commonPrefixRemaining.size();
|
||||||
|
assume(consumed >= 0);
|
||||||
|
|
||||||
|
job->begin = job->begin.subspan(consumed, int(job->begin.size()) - consumed);
|
||||||
|
job->end = job->end.subspan(consumed, int(job->end.size()) - consumed);
|
||||||
|
job->lcp -= consumed;
|
||||||
|
|
||||||
|
*job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end,
|
||||||
|
job->readVersion, context->tls)
|
||||||
|
? ConflictSet::Commit
|
||||||
|
: ConflictSet::Conflict;
|
||||||
|
MUSTTAIL return complete(job, context);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace check_range_read_state_machine
|
} // namespace check_range_read_state_machine
|
||||||
|
|
||||||
void CheckJob::init(const ConflictSet::ReadRange *read,
|
void CheckJob::init(const ConflictSet::ReadRange *read,
|
||||||
|
Reference in New Issue
Block a user