diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-14 10:06:02 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-14 10:06:02 +0000 |
commit | c42f79f549cf5d292c343bf359ed73ad55c38183 (patch) | |
tree | 51179e4792e08cdeadafc51c41f5c0f9bb933791 | |
parent | e07397569ebe62ef3ecb62f2f2698d4cb798893f (diff) |
Add CommitChunk
-rw-r--r-- | searchlib/src/tests/transactionlog/chunks_test.cpp | 49 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/transactionlog/common.cpp | 12 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/transactionlog/common.h | 2 |
3 files changed, 57 insertions, 6 deletions
diff --git a/searchlib/src/tests/transactionlog/chunks_test.cpp b/searchlib/src/tests/transactionlog/chunks_test.cpp index 8605fa2b4d6..692bde54727 100644 --- a/searchlib/src/tests/transactionlog/chunks_test.cpp +++ b/searchlib/src/tests/transactionlog/chunks_test.cpp @@ -2,6 +2,7 @@ #include <vespa/searchlib/transactionlog/chunks.h> #include <vespa/vespalib/testkit/testapp.h> +#include <atomic> #include <vespa/log/log.h> LOG_SETUP("translog_chunks_test"); @@ -12,6 +13,7 @@ using vespalib::nbostream; using vespalib::compression::CompressionConfig; constexpr const char * TEXT = "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz"; +constexpr const char * TEXT2 = "something else"; void verifySerializationAndDeserialization(IChunk & org, size_t numEntries, Encoding expected) { @@ -69,4 +71,51 @@ TEST("test serialization and deserialization of uncompressable zstd") { verifySerializationAndDeserialization(chunk, 1, Encoding(Encoding::Crc::xxh64, Encoding::Compression::none_multi)); } +TEST("test empty commitchunk") { + CommitChunk cc(1,1); + EXPECT_EQUAL(0ms, cc.age()); + EXPECT_EQUAL(0u, cc.sizeBytes()); + EXPECT_EQUAL(0u, cc.getNumCallBacks()); +} + +struct Counter : public search::IDestructorCallback { + std::atomic<uint32_t> & _counter; + Counter(std::atomic<uint32_t> & counter) : _counter(counter) { _counter++; } + ~Counter() override { _counter--; } +}; + +TEST("test single element commitchunk") { + std::atomic<uint32_t> counter(0); + { + Packet p(100); + p.add(Packet::Entry(1, 1, ConstBufferRef(TEXT, strlen(TEXT)))); + CommitChunk cc(0, 0); + + cc.add(p, std::make_shared<Counter>(counter)); + EXPECT_EQUAL(1u, counter); + EXPECT_GREATER(cc.age(), 0ms); + EXPECT_EQUAL(150u, cc.sizeBytes()); + EXPECT_EQUAL(1u, cc.getNumCallBacks()); + } + EXPECT_EQUAL(0u, counter); +} + +TEST("test multi element commitchunk") { + std::atomic<uint32_t> counter(0); + { + Packet p(100); + p.add(Packet::Entry(1, 3, ConstBufferRef(TEXT, strlen(TEXT)))); + CommitChunk cc(1000, 10); + + cc.add(p, std::make_shared<Counter>(counter)); + Packet p2(100); + p2.add(Packet::Entry(2, 2, ConstBufferRef(TEXT2, strlen(TEXT2)))); + cc.add(p2, std::make_shared<Counter>(counter)); + EXPECT_EQUAL(2u, counter); + EXPECT_GREATER(cc.age(), 0ms); + EXPECT_EQUAL(180u, cc.sizeBytes()); + EXPECT_EQUAL(2u, cc.getNumCallBacks()); + } + EXPECT_EQUAL(0u, counter); +} TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/vespa/searchlib/transactionlog/common.cpp b/searchlib/src/vespa/searchlib/transactionlog/common.cpp index 209616614f7..fcd26c8fc36 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/common.cpp +++ b/searchlib/src/vespa/searchlib/transactionlog/common.cpp @@ -121,11 +121,13 @@ Packet::add(const Packet::Entry & e) _range.to(e.serial()); } -CommitChunk::CommitChunk() - : _data(size_t(-1)), - _callBacks(), - _firstArrivalTime() -{} +CommitChunk::CommitChunk(size_t reserveBytes, size_t reserveCount) + : _data(reserveBytes), + _callBacks(), + _firstArrivalTime() +{ + _callBacks.reserve(reserveCount); +} CommitChunk::~CommitChunk() = default; diff --git a/searchlib/src/vespa/searchlib/transactionlog/common.h b/searchlib/src/vespa/searchlib/transactionlog/common.h index ae2f6f1a962..c5427c5b401 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/common.h +++ b/searchlib/src/vespa/searchlib/transactionlog/common.h @@ -106,7 +106,7 @@ public: class CommitChunk { public: - CommitChunk(); + CommitChunk(size_t reserveBytes, size_t reserveCount); ~CommitChunk(); void add(const Packet & packet, Writer::DoneCallback onDone); size_t sizeBytes() const { return _data.sizeBytes(); } |