aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahoo-inc.com>2017-05-09 10:31:26 +0000
committerGeir Storli <geirst@yahoo-inc.com>2017-05-12 14:01:23 +0000
commit5b3771f5173ba75036b32444ffd2afddad18e05e (patch)
tree98432224dd6d683d3b6672b2d75a51e1cb1aae14 /searchlib/src/tests
parent9211b09e161580f5c9b12631a85d13f6b0e47357 (diff)
Skip entries with lid >= docIdLimit in updateLidMap().
Diffstat (limited to 'searchlib/src/tests')
-rw-r--r--searchlib/src/tests/docstore/file_chunk/file_chunk_test.cpp67
1 files changed, 63 insertions, 4 deletions
diff --git a/searchlib/src/tests/docstore/file_chunk/file_chunk_test.cpp b/searchlib/src/tests/docstore/file_chunk/file_chunk_test.cpp
index cb2eb0a0044..ec7759a6cbc 100644
--- a/searchlib/src/tests/docstore/file_chunk/file_chunk_test.cpp
+++ b/searchlib/src/tests/docstore/file_chunk/file_chunk_test.cpp
@@ -5,7 +5,10 @@
#include <vespa/searchlib/docstore/filechunk.h>
#include <vespa/searchlib/docstore/writeablefilechunk.h>
#include <vespa/searchlib/test/directory_handler.h>
+#include <vespa/vespalib/test/insertion_operators.h>
#include <vespa/vespalib/util/threadstackexecutor.h>
+#include <iomanip>
+#include <iostream>
#include <vespa/log/log.h>
LOG_SETUP("file_chunk_test");
@@ -15,8 +18,6 @@ using namespace search;
using common::FileHeaderContext;
using vespalib::ThreadStackExecutor;
-constexpr uint64_t initSerialNum = 10;
-
struct MyFileHeaderContext : public FileHeaderContext {
virtual void addTags(vespalib::GenericHeader &header, const vespalib::string &name) const override {
(void) header;
@@ -24,27 +25,53 @@ struct MyFileHeaderContext : public FileHeaderContext {
}
};
+struct SetLidObserver : public ISetLid {
+ std::vector<uint32_t> lids;
+ virtual void setLid(const vespalib::LockGuard &guard, uint32_t lid, const LidInfo &lidInfo) override {
+ (void) guard;
+ (void) lidInfo;
+ lids.push_back(lid);
+ }
+};
+
+vespalib::string
+getData(uint32_t lid)
+{
+ std::ostringstream oss;
+ oss << "data_" << std::setw(5) << std::setfill('0') << lid;
+ return oss.str();
+}
+
struct Fixture {
test::DirectoryHandler dir;
ThreadStackExecutor executor;
+ uint64_t serialNum;
TuneFileSummary tuneFile;
MyFileHeaderContext fileHeaderCtx;
+ vespalib::Lock updateLock;
+ SetLidObserver lidObserver;
WriteableFileChunk chunk;
+ uint64_t nextSerialNum() {
+ return serialNum++;
+ };
+
Fixture(const vespalib::string &baseName,
uint32_t docIdLimit,
bool dirCleanup = true)
: dir(baseName),
executor(1, 0x10000),
+ serialNum(1),
tuneFile(),
fileHeaderCtx(),
+ updateLock(),
chunk(executor,
FileChunk::FileId(0),
FileChunk::NameId(1234),
baseName,
- initSerialNum,
+ serialNum,
docIdLimit,
- WriteableFileChunk::Config(),
+ WriteableFileChunk::Config(document::CompressionConfig(), 0x1000),
tuneFile,
fileHeaderCtx,
nullptr,
@@ -53,6 +80,22 @@ struct Fixture {
dir.cleanup(dirCleanup);
}
~Fixture() {}
+ void flush() {
+ chunk.flush(true, serialNum);
+ chunk.flushPendingChunks(serialNum);
+ }
+ Fixture &append(uint32_t lid) {
+ vespalib::string data = getData(lid);
+ chunk.append(nextSerialNum(), lid, data.c_str(), data.size());
+ return *this;
+ }
+ void updateLidMap(uint32_t docIdLimit) {
+ vespalib::LockGuard guard(updateLock);
+ chunk.updateLidMap(guard, lidObserver, serialNum, docIdLimit);
+ }
+ void assertLidMap(const std::vector<uint32_t> &expLids) {
+ EXPECT_EQUAL(expLids, lidObserver.lids);
+ }
};
TEST_F("require that idx file without docIdLimit in header can be read", Fixture("without_doc_id_limit", 1000, false))
@@ -71,5 +114,21 @@ TEST("require that docIdLimit is written to and read from idx file header")
}
}
+TEST("require that entries with lid >= docIdLimit are skipped in updateLidMap()")
+{
+ {
+ Fixture f("tmp", 0, false);
+ f.append(1).append(10).append(100).append(999).append(1000).append(1001).append(998).append(1002).append(999);
+ f.flush();
+ }
+ {
+ Fixture f("tmp", 0);
+ f.updateLidMap(1000);
+ f.assertLidMap({1,10,100,999,998,999});
+ EXPECT_EQUAL(3u, f.chunk.getBloatCount());
+ EXPECT_EQUAL(3u * (10 + 8), f.chunk.getErasedBytes());
+ }
+}
+
TEST_MAIN() { TEST_RUN_ALL(); }