summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-10-03 09:41:13 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-10-03 09:46:03 +0000
commit6b27ae6138a1e924a39806bc1de75ef91c30a5c6 (patch)
tree0cc184c87011e5f598e34e418662a6d52e3d168b
parent6446b42c81bf21f4bbe2772813a27e426e92f157 (diff)
Prevent eternal loop if bit vectors are shorter than docid limit
-rw-r--r--searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h1
3 files changed, 8 insertions, 8 deletions
diff --git a/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp b/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
index dd3394db507..23f77a9d9d9 100644
--- a/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
+++ b/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
@@ -578,7 +578,7 @@ createDual(Fixture & f, TermFieldMatchData & tfmd, int32_t docIdLimit) {
MultiSearch::Children children;
children.push_back(f.createIter(0, false, tfmd, true));
children.push_back(f.createIter(1, false, tfmd, true));
- SearchIterator::UP s = AndSearch::create(std::move(children), false);
+ SearchIterator::UP s = AndSearch::create(std::move(children), true);
s = MultiBitVectorIteratorBase::optimize(std::move(s));
EXPECT_TRUE(s);
if (docIdLimit < 0) {
@@ -612,12 +612,11 @@ TEST_F("test that short vectors don't spin at end", Fixture) {
countUntilEnd(*createDual(f, tfmd, f._bvs[0]->size()));
countUntilDocId(*createDual(f, tfmd, f._bvs[0]->size()));
- // Below fails with eternal loop
- //countUntilDocId(*createDual(f, tfmd, f._bvs[0]->size() + 1));
- //countUntilEnd(*createDual(f, tfmd, f._bvs[0]->size() + 1));
+ countUntilDocId(*createDual(f, tfmd, f._bvs[0]->size() + 1));
+ countUntilEnd(*createDual(f, tfmd, f._bvs[0]->size() + 1));
- //countUntilDocId(*createDual(f, tfmd, -1));
- //countUntilEnd(*createDual(f, tfmd, -1));
+ countUntilDocId(*createDual(f, tfmd, -1));
+ countUntilEnd(*createDual(f, tfmd, -1));
}
class Verifier : public search::test::SearchIteratorVerifier {
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
index 6408004ea32..563a88e860f 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
@@ -66,7 +66,7 @@ bool
MultiBitVector<Update>::updateLastValue(uint32_t docId) noexcept
{
if (docId >= _lastMaxDocIdLimit) {
- if (__builtin_expect(docId >= _numDocs, false)) {
+ if (__builtin_expect(isAtEnd(docId), false)) {
return true;
}
const uint32_t index(BitWord::wordNum(docId));
@@ -147,7 +147,7 @@ public:
private:
void doSeek(uint32_t docId) override {
docId = this->_mbv.strictSeek(docId);
- if (__builtin_expect(docId >= this->getEndId(), false)) {
+ if (__builtin_expect(this->_mbv.isAtEnd(docId), false)) {
this->setAtEnd();
} else {
this->setDocId(docId);
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
index 5c3d17c6786..855ecfae60c 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
@@ -19,6 +19,7 @@ public:
_lastMaxDocIdLimit = 0;
_lastMaxDocIdLimitRequireFetch = 0;
}
+ bool isAtEnd(uint32_t docId) const noexcept { return docId >= _numDocs; }
void addBitVector(Meta bv, uint32_t docIdLimit);
protected:
uint32_t _numDocs;