summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-09-14 10:06:02 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-09-14 10:06:02 +0000
commitc42f79f549cf5d292c343bf359ed73ad55c38183 (patch)
tree51179e4792e08cdeadafc51c41f5c0f9bb933791
parente07397569ebe62ef3ecb62f2f2698d4cb798893f (diff)
Add CommitChunk
-rw-r--r--searchlib/src/tests/transactionlog/chunks_test.cpp49
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/common.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/common.h2
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(); }