diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-10-03 09:41:13 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-10-03 09:46:03 +0000 |
commit | 6b27ae6138a1e924a39806bc1de75ef91c30a5c6 (patch) | |
tree | 0cc184c87011e5f598e34e418662a6d52e3d168b | |
parent | 6446b42c81bf21f4bbe2772813a27e426e92f157 (diff) |
Prevent eternal loop if bit vectors are shorter than docid limit
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; |