Make better use of static node type info for check left side
This commit is contained in:
@@ -3333,7 +3333,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
|||||||
MUSTTAIL return done_common_prefix_iter(job, context);
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
job->n = job->child;
|
job->n = child;
|
||||||
job->remaining = job->remaining.subspan(1 + child->partialKeyLen,
|
job->remaining = job->remaining.subspan(1 + child->partialKeyLen,
|
||||||
job->remaining.size() -
|
job->remaining.size() -
|
||||||
(1 + child->partialKeyLen));
|
(1 + child->partialKeyLen));
|
||||||
@@ -3344,7 +3344,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
|||||||
MUSTTAIL return done_common_prefix_iter(job, context);
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto c = getChild(job->n, job->remaining[0]);
|
auto c = getChild(child, job->remaining[0]);
|
||||||
job->child = c;
|
job->child = c;
|
||||||
if (job->child == nullptr) {
|
if (job->child == nullptr) {
|
||||||
MUSTTAIL return done_common_prefix_iter(job, context);
|
MUSTTAIL return done_common_prefix_iter(job, context);
|
||||||
@@ -3456,34 +3456,36 @@ FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *job,
|
|||||||
template <class NodeT>
|
template <class NodeT>
|
||||||
FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job,
|
FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job,
|
||||||
CheckContext *context) {
|
CheckContext *context) {
|
||||||
|
assert(NodeT::kType == job->n->getType());
|
||||||
|
NodeT *n = static_cast<NodeT *>(job->n);
|
||||||
|
|
||||||
job->remaining = job->remaining.subspan(1, job->remaining.size() - 1);
|
job->remaining = job->remaining.subspan(1, job->remaining.size() - 1);
|
||||||
++job->searchPathLen;
|
++job->searchPathLen;
|
||||||
|
|
||||||
if (job->n->partialKeyLen > 0) {
|
if (n->partialKeyLen > 0) {
|
||||||
int commonLen = std::min<int>(job->n->partialKeyLen, job->remaining.size());
|
int commonLen = std::min<int>(n->partialKeyLen, job->remaining.size());
|
||||||
int i = longestCommonPrefix(job->n->partialKey(), job->remaining.data(),
|
int i =
|
||||||
commonLen);
|
longestCommonPrefix(n->partialKey(), job->remaining.data(), commonLen);
|
||||||
job->searchPathLen += i;
|
job->searchPathLen += i;
|
||||||
if (i < commonLen) {
|
if (i < commonLen) {
|
||||||
auto c = job->n->partialKey()[i] <=> job->remaining[i];
|
auto c = n->partialKey()[i] <=> job->remaining[i];
|
||||||
if (c > 0) {
|
if (c > 0) {
|
||||||
if (job->searchPathLen < job->prefixLen) {
|
if (job->searchPathLen < job->prefixLen) {
|
||||||
job->continuation = left_side_down_left_spine;
|
job->continuation = left_side_down_left_spine;
|
||||||
MUSTTAIL return job->continuation(job, context);
|
MUSTTAIL return job->continuation(job, context);
|
||||||
}
|
}
|
||||||
if (job->n->entryPresent &&
|
if (n->entryPresent && n->entry.rangeVersion > job->readVersion) {
|
||||||
job->n->entry.rangeVersion > job->readVersion) {
|
|
||||||
job->setResult(false);
|
job->setResult(false);
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
}
|
}
|
||||||
if (maxVersion(job->n) > job->readVersion) {
|
if (maxVersion(n) > job->readVersion) {
|
||||||
job->setResult(false);
|
job->setResult(false);
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
}
|
}
|
||||||
job->continuation = done_left_side_iter;
|
job->continuation = done_left_side_iter;
|
||||||
MUSTTAIL return job->continuation(job, context);
|
MUSTTAIL return job->continuation(job, context);
|
||||||
} else {
|
} else {
|
||||||
job->n = nextSibling(job->n);
|
job->n = nextSibling(n);
|
||||||
if (job->n == nullptr) {
|
if (job->n == nullptr) {
|
||||||
job->continuation = done_left_side_iter;
|
job->continuation = done_left_side_iter;
|
||||||
MUSTTAIL return job->continuation(job, context);
|
MUSTTAIL return job->continuation(job, context);
|
||||||
@@ -3492,18 +3494,17 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job,
|
|||||||
MUSTTAIL return job->continuation(job, context);
|
MUSTTAIL return job->continuation(job, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (commonLen == job->n->partialKeyLen) {
|
if (commonLen == n->partialKeyLen) {
|
||||||
// partial key matches
|
// partial key matches
|
||||||
job->remaining =
|
job->remaining =
|
||||||
job->remaining.subspan(commonLen, job->remaining.size() - commonLen);
|
job->remaining.subspan(commonLen, job->remaining.size() - commonLen);
|
||||||
} else if (job->n->partialKeyLen > int(job->remaining.size())) {
|
} else if (n->partialKeyLen > int(job->remaining.size())) {
|
||||||
assert(job->searchPathLen >= job->prefixLen);
|
assert(job->searchPathLen >= job->prefixLen);
|
||||||
if (job->n->entryPresent &&
|
if (n->entryPresent && n->entry.rangeVersion > job->readVersion) {
|
||||||
job->n->entry.rangeVersion > job->readVersion) {
|
|
||||||
job->setResult(false);
|
job->setResult(false);
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
}
|
}
|
||||||
if (maxVersion(job->n) > job->readVersion) {
|
if (maxVersion(n) > job->readVersion) {
|
||||||
job->setResult(false);
|
job->setResult(false);
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
}
|
}
|
||||||
@@ -3516,7 +3517,7 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job,
|
|||||||
|
|
||||||
if (job->remaining.size() == 0) {
|
if (job->remaining.size() == 0) {
|
||||||
assert(job->searchPathLen >= job->prefixLen);
|
assert(job->searchPathLen >= job->prefixLen);
|
||||||
if (maxVersion(job->n) > job->readVersion) {
|
if (maxVersion(n) > job->readVersion) {
|
||||||
*job->result = ConflictSet::Conflict;
|
*job->result = ConflictSet::Conflict;
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
} else {
|
} else {
|
||||||
@@ -3526,17 +3527,17 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (job->searchPathLen >= job->prefixLen) {
|
if (job->searchPathLen >= job->prefixLen) {
|
||||||
if (!checkMaxBetweenExclusive(job->n, job->remaining[0], 256,
|
if (!checkMaxBetweenExclusive(n, job->remaining[0], 256, job->readVersion,
|
||||||
job->readVersion, context->tls)) {
|
context->tls)) {
|
||||||
*job->result = ConflictSet::Conflict;
|
*job->result = ConflictSet::Conflict;
|
||||||
MUSTTAIL return complete(job, context);
|
MUSTTAIL return complete(job, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto c = getChild(job->n, job->remaining[0]);
|
auto c = getChild(n, job->remaining[0]);
|
||||||
Node *child = c;
|
Node *child = c;
|
||||||
if (child == nullptr) {
|
if (child == nullptr) {
|
||||||
auto c = getChildGeq(job->n, job->remaining[0]);
|
auto c = getChildGeq(n, job->remaining[0]);
|
||||||
if (c != nullptr) {
|
if (c != nullptr) {
|
||||||
if (job->searchPathLen < job->prefixLen) {
|
if (job->searchPathLen < job->prefixLen) {
|
||||||
job->n = c;
|
job->n = c;
|
||||||
|
Reference in New Issue
Block a user