summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/memoryindex/datastore
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahoo-inc.com>2016-11-04 15:40:16 +0100
committerGeir Storli <geirst@yahoo-inc.com>2016-11-04 15:40:16 +0100
commit337b577702fbea32d3a052d4a7266eff5440c5eb (patch)
tree5053acdf000a496dbb8dad5ab2cd82fea14844ae /searchlib/src/tests/memoryindex/datastore
parent72052a806a83c57a7240296239c2daa0653f0136 (diff)
Move datastore unit tests into separate folder.
Diffstat (limited to 'searchlib/src/tests/memoryindex/datastore')
-rw-r--r--searchlib/src/tests/memoryindex/datastore/CMakeLists.txt7
-rw-r--r--searchlib/src/tests/memoryindex/datastore/DESC2
-rw-r--r--searchlib/src/tests/memoryindex/datastore/FILES2
-rw-r--r--searchlib/src/tests/memoryindex/datastore/datastore_test.cpp432
4 files changed, 2 insertions, 441 deletions
diff --git a/searchlib/src/tests/memoryindex/datastore/CMakeLists.txt b/searchlib/src/tests/memoryindex/datastore/CMakeLists.txt
index de59c92e590..9c90ae7f776 100644
--- a/searchlib/src/tests/memoryindex/datastore/CMakeLists.txt
+++ b/searchlib/src/tests/memoryindex/datastore/CMakeLists.txt
@@ -1,11 +1,4 @@
# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-vespa_add_executable(searchlib_datastore_test_app TEST
- SOURCES
- datastore_test.cpp
- DEPENDS
- searchlib
-)
-vespa_add_test(NAME searchlib_datastore_test_app COMMAND searchlib_datastore_test_app)
vespa_add_executable(searchlib_featurestore_test_app TEST
SOURCES
featurestore_test.cpp
diff --git a/searchlib/src/tests/memoryindex/datastore/DESC b/searchlib/src/tests/memoryindex/datastore/DESC
index 56725396b65..2851a4c7e6a 100644
--- a/searchlib/src/tests/memoryindex/datastore/DESC
+++ b/searchlib/src/tests/memoryindex/datastore/DESC
@@ -1 +1 @@
-datastore test. Take a look at datastore_test.cpp and wordstore_test.cpp for details.
+datastore tests. Take a look at featurestore_test.cpp and wordstore_test.cpp for details.
diff --git a/searchlib/src/tests/memoryindex/datastore/FILES b/searchlib/src/tests/memoryindex/datastore/FILES
index 6cbbaf6a328..42d862c8c16 100644
--- a/searchlib/src/tests/memoryindex/datastore/FILES
+++ b/searchlib/src/tests/memoryindex/datastore/FILES
@@ -1,2 +1,2 @@
-datastore_test.cpp
+featurestore_test.cpp
wordstore_test.cpp
diff --git a/searchlib/src/tests/memoryindex/datastore/datastore_test.cpp b/searchlib/src/tests/memoryindex/datastore/datastore_test.cpp
deleted file mode 100644
index de673c8c0c9..00000000000
--- a/searchlib/src/tests/memoryindex/datastore/datastore_test.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/fastos/fastos.h>
-#include <vespa/log/log.h>
-LOG_SETUP("datastore_test");
-#include <vespa/vespalib/testkit/testapp.h>
-#include <vespa/searchlib/datastore/datastore.h>
-#include <vespa/searchlib/datastore/datastore.hpp>
-
-namespace search {
-namespace datastore {
-
-class MyStore : public DataStore<int, EntryRefT<3, 2> > {
-private:
- typedef DataStore<int, EntryRefT<3, 2> > ParentType;
- using ParentType::_buffers;
- using ParentType::_states;
- using ParentType::_activeBufferIds;
-public:
- MyStore() {}
-
- void
- holdBuffer(uint32_t bufferId)
- {
- ParentType::holdBuffer(bufferId);
- }
-
- void
- holdElem(EntryRef ref, uint64_t len)
- {
- ParentType::holdElem(ref, len);
- }
-
- void
- transferHoldLists(generation_t generation)
- {
- ParentType::transferHoldLists(generation);
- }
-
- void trimElemHoldList(generation_t usedGen) {
- ParentType::trimElemHoldList(usedGen);
- }
- void incDead(EntryRef ref, uint64_t dead) {
- ParentType::incDead(ref, dead);
- }
- void ensureBufferCapacity(size_t sizeNeeded) {
- ParentType::ensureBufferCapacity(0, sizeNeeded);
- }
- void enableFreeLists() {
- ParentType::enableFreeLists();
- }
-
- void
- switchActiveBuffer(void)
- {
- ParentType::switchActiveBuffer(0, 0u);
- }
- std::vector<void *> & buffers() { return _buffers; }
- std::vector<BufferState> &statesVec() { return _states; }
- size_t activeBufferId() const { return _activeBufferIds[0]; }
-};
-
-typedef MyStore::RefType MyRef;
-
-class Test : public vespalib::TestApp {
-private:
- bool assertMemStats(const DataStoreBase::MemStats & exp,
- const DataStoreBase::MemStats & act);
- void requireThatEntryRefIsWorking();
- void requireThatAlignedEntryRefIsWorking();
- void requireThatEntriesCanBeAddedAndRetrieved();
- void requireThatAddEntryTriggersChangeOfBuffer();
- void requireThatWeCanHoldAndTrimBuffers();
- void requireThatWeCanHoldAndTrimElements();
- void requireThatWeCanUseFreeLists();
- void requireThatMemoryStatsAreCalculated();
- void requireThatMemoryUsageIsCalculated();
-
- void
- requireThatWecanDisableElemHoldList(void);
-public:
- int Main();
-};
-
-bool
-Test::assertMemStats(const DataStoreBase::MemStats & exp,
- const DataStoreBase::MemStats & act)
-{
- if (!EXPECT_EQUAL(exp._allocElems, act._allocElems)) return false;
- if (!EXPECT_EQUAL(exp._usedElems, act._usedElems)) return false;
- if (!EXPECT_EQUAL(exp._deadElems, act._deadElems)) return false;
- if (!EXPECT_EQUAL(exp._holdElems, act._holdElems)) return false;
- if (!EXPECT_EQUAL(exp._freeBuffers, act._freeBuffers)) return false;
- if (!EXPECT_EQUAL(exp._activeBuffers, act._activeBuffers)) return false;
- if (!EXPECT_EQUAL(exp._holdBuffers, act._holdBuffers)) return false;
- return true;
-}
-
-void
-Test::requireThatEntryRefIsWorking()
-{
- typedef EntryRefT<22> MyRefType;
- EXPECT_EQUAL(4194304u, MyRefType::offsetSize());
- EXPECT_EQUAL(1024u, MyRefType::numBuffers());
- {
- MyRefType r(0, 0);
- EXPECT_EQUAL(0u, r.offset());
- EXPECT_EQUAL(0u, r.bufferId());
- }
- {
- MyRefType r(237, 13);
- EXPECT_EQUAL(237u, r.offset());
- EXPECT_EQUAL(13u, r.bufferId());
- }
- {
- MyRefType r(4194303, 1023);
- EXPECT_EQUAL(4194303u, r.offset());
- EXPECT_EQUAL(1023u, r.bufferId());
- }
- {
- MyRefType r1(6498, 76);
- MyRefType r2(r1);
- EXPECT_EQUAL(r1.offset(), r2.offset());
- EXPECT_EQUAL(r1.bufferId(), r2.bufferId());
- }
-}
-
-void
-Test::requireThatAlignedEntryRefIsWorking()
-{
- typedef AlignedEntryRefT<22, 2> MyRefType; // 4 byte alignement
- EXPECT_EQUAL(4 * 4194304u, MyRefType::offsetSize());
- EXPECT_EQUAL(1024u, MyRefType::numBuffers());
- EXPECT_EQUAL(0u, MyRefType::align(0));
- EXPECT_EQUAL(4u, MyRefType::align(1));
- EXPECT_EQUAL(4u, MyRefType::align(2));
- EXPECT_EQUAL(4u, MyRefType::align(3));
- EXPECT_EQUAL(4u, MyRefType::align(4));
- EXPECT_EQUAL(8u, MyRefType::align(5));
- {
- MyRefType r(0, 0);
- EXPECT_EQUAL(0u, r.offset());
- EXPECT_EQUAL(0u, r.bufferId());
- }
- {
- MyRefType r(237, 13);
- EXPECT_EQUAL(MyRefType::align(237), r.offset());
- EXPECT_EQUAL(13u, r.bufferId());
- }
- {
- MyRefType r(MyRefType::offsetSize() - 4, 1023);
- EXPECT_EQUAL(MyRefType::align(MyRefType::offsetSize() - 4), r.offset());
- EXPECT_EQUAL(1023u, r.bufferId());
- }
-}
-
-void
-Test::requireThatEntriesCanBeAddedAndRetrieved()
-{
- typedef DataStore<int> IntStore;
- IntStore ds;
- EntryRef r1 = ds.addEntry(10);
- EntryRef r2 = ds.addEntry(20);
- EntryRef r3 = ds.addEntry(30);
- EXPECT_EQUAL(1u, IntStore::RefType(r1).offset());
- EXPECT_EQUAL(2u, IntStore::RefType(r2).offset());
- EXPECT_EQUAL(3u, IntStore::RefType(r3).offset());
- EXPECT_EQUAL(0u, IntStore::RefType(r1).bufferId());
- EXPECT_EQUAL(0u, IntStore::RefType(r2).bufferId());
- EXPECT_EQUAL(0u, IntStore::RefType(r3).bufferId());
- EXPECT_EQUAL(10, ds.getEntry(r1));
- EXPECT_EQUAL(20, ds.getEntry(r2));
- EXPECT_EQUAL(30, ds.getEntry(r3));
-}
-
-void
-Test::requireThatAddEntryTriggersChangeOfBuffer()
-{
- typedef DataStore<uint64_t, EntryRefT<10, 10> > Store;
- Store s;
- uint64_t num = 0;
- uint32_t lastId = 0;
- uint64_t lastNum = 0;
- for (;;++num) {
- EntryRef r = s.addEntry(num);
- EXPECT_EQUAL(num, s.getEntry(r));
- uint32_t bufferId = Store::RefType(r).bufferId();
- if (bufferId > lastId) {
- LOG(info, "Changed to bufferId %u after %" PRIu64 " nums", bufferId, num);
- EXPECT_EQUAL(Store::RefType::offsetSize() - (lastId == 0),
- num - lastNum);
- lastId = bufferId;
- lastNum = num;
- }
- if (bufferId == 2) {
- break;
- }
- }
- EXPECT_EQUAL(Store::RefType::offsetSize() * 2 - 1, num);
- LOG(info, "Added %" PRIu64 " nums in 2 buffers", num);
-}
-
-void
-Test::requireThatWeCanHoldAndTrimBuffers()
-{
- MyStore s;
- EXPECT_EQUAL(0u, MyRef(s.addEntry(1)).bufferId());
- s.switchActiveBuffer();
- EXPECT_EQUAL(1u, s.activeBufferId());
- s.holdBuffer(0); // hold last buffer
- s.transferHoldLists(10);
-
- EXPECT_EQUAL(1u, MyRef(s.addEntry(2)).bufferId());
- s.switchActiveBuffer();
- EXPECT_EQUAL(2u, s.activeBufferId());
- s.holdBuffer(1); // hold last buffer
- s.transferHoldLists(20);
-
- EXPECT_EQUAL(2u, MyRef(s.addEntry(3)).bufferId());
- s.switchActiveBuffer();
- EXPECT_EQUAL(3u, s.activeBufferId());
- s.holdBuffer(2); // hold last buffer
- s.transferHoldLists(30);
-
- EXPECT_EQUAL(3u, MyRef(s.addEntry(4)).bufferId());
- s.holdBuffer(3); // hold current buffer
- s.transferHoldLists(40);
-
- EXPECT_TRUE(s.statesVec()[0].size() != 0);
- EXPECT_TRUE(s.statesVec()[1].size() != 0);
- EXPECT_TRUE(s.statesVec()[2].size() != 0);
- EXPECT_TRUE(s.statesVec()[3].size() != 0);
- s.trimHoldLists(11);
- EXPECT_TRUE(s.statesVec()[0].size() == 0);
- EXPECT_TRUE(s.statesVec()[1].size() != 0);
- EXPECT_TRUE(s.statesVec()[2].size() != 0);
- EXPECT_TRUE(s.statesVec()[3].size() != 0);
-
- s.switchActiveBuffer();
- EXPECT_EQUAL(0u, s.activeBufferId());
- EXPECT_EQUAL(0u, MyRef(s.addEntry(5)).bufferId());
- s.trimHoldLists(41);
- EXPECT_TRUE(s.statesVec()[0].size() != 0);
- EXPECT_TRUE(s.statesVec()[1].size() == 0);
- EXPECT_TRUE(s.statesVec()[2].size() == 0);
- EXPECT_TRUE(s.statesVec()[3].size() == 0);
-}
-
-void
-Test::requireThatWeCanHoldAndTrimElements()
-{
- MyStore s;
- MyRef r1 = s.addEntry(1);
- s.holdElem(r1, 1);
- s.transferHoldLists(10);
- MyRef r2 = s.addEntry(2);
- s.holdElem(r2, 1);
- s.transferHoldLists(20);
- MyRef r3 = s.addEntry(3);
- s.holdElem(r3, 1);
- s.transferHoldLists(30);
- EXPECT_EQUAL(1, s.getEntry(r1));
- EXPECT_EQUAL(2, s.getEntry(r2));
- EXPECT_EQUAL(3, s.getEntry(r3));
- s.trimElemHoldList(11);
- EXPECT_EQUAL(0, s.getEntry(r1));
- EXPECT_EQUAL(2, s.getEntry(r2));
- EXPECT_EQUAL(3, s.getEntry(r3));
- s.trimElemHoldList(31);
- EXPECT_EQUAL(0, s.getEntry(r1));
- EXPECT_EQUAL(0, s.getEntry(r2));
- EXPECT_EQUAL(0, s.getEntry(r3));
-}
-
-void
-Test::requireThatWeCanUseFreeLists()
-{
- MyStore s;
- s.enableFreeLists();
- MyRef r1 = s.addEntry2(1);
- s.holdElem(r1, 1);
- s.transferHoldLists(10);
- MyRef r2 = s.addEntry2(2);
- s.holdElem(r2, 1);
- s.transferHoldLists(20);
- s.trimElemHoldList(11);
- MyRef r3 = s.addEntry2(3); // reuse r1
- EXPECT_EQUAL(r1.offset(), r3.offset());
- EXPECT_EQUAL(r1.bufferId(), r3.bufferId());
- MyRef r4 = s.addEntry2(4);
- EXPECT_EQUAL(r2.offset() + 1, r4.offset());
- s.trimElemHoldList(21);
- MyRef r5 = s.addEntry2(5); // reuse r2
- EXPECT_EQUAL(r2.offset(), r5.offset());
- EXPECT_EQUAL(r2.bufferId(), r5.bufferId());
- MyRef r6 = s.addEntry2(6);
- EXPECT_EQUAL(r4.offset() + 1, r6.offset());
- EXPECT_EQUAL(3, s.getEntry(r1));
- EXPECT_EQUAL(5, s.getEntry(r2));
- EXPECT_EQUAL(3, s.getEntry(r3));
- EXPECT_EQUAL(4, s.getEntry(r4));
- EXPECT_EQUAL(5, s.getEntry(r5));
- EXPECT_EQUAL(6, s.getEntry(r6));
-}
-
-void
-Test::requireThatMemoryStatsAreCalculated()
-{
- MyStore s;
- DataStoreBase::MemStats m;
- m._allocElems = MyRef::offsetSize();
- m._usedElems = 1; // ref = 0 is reserved
- m._deadElems = 1; // ref = 0 is reserved
- m._holdElems = 0;
- m._activeBuffers = 1;
- m._freeBuffers = MyRef::numBuffers() - 1;
- m._holdBuffers = 0;
- EXPECT_TRUE(assertMemStats(m, s.getMemStats()));
-
- // add entry
- MyRef r = s.addEntry(10);
- m._usedElems++;
- EXPECT_TRUE(assertMemStats(m, s.getMemStats()));
-
- // inc dead
- s.incDead(r, 1);
- m._deadElems++;
- EXPECT_TRUE(assertMemStats(m, s.getMemStats()));
-
- // hold buffer
- s.addEntry(20);
- s.addEntry(30);
- s.holdBuffer(r.bufferId());
- s.transferHoldLists(100);
- m._usedElems += 2;
- m._holdElems += 2; // used - dead
- m._activeBuffers--;
- m._holdBuffers++;
- EXPECT_TRUE(assertMemStats(m, s.getMemStats()));
-
- // new active buffer
- s.switchActiveBuffer();
- s.addEntry(40);
- m._allocElems += MyRef::offsetSize();
- m._usedElems++;
- m._activeBuffers++;
- m._freeBuffers--;
-
- // trim hold buffer
- s.trimHoldLists(101);
- m._allocElems -= MyRef::offsetSize();
- m._usedElems = 1;
- m._deadElems = 0;
- m._holdElems = 0;
- m._freeBuffers = MyRef::numBuffers() - 1;
- m._holdBuffers = 0;
- EXPECT_TRUE(assertMemStats(m, s.getMemStats()));
-}
-
-void
-Test::requireThatMemoryUsageIsCalculated()
-{
- MyStore s;
- MyRef r = s.addEntry(10);
- s.addEntry(20);
- s.addEntry(30);
- s.addEntry(40);
- s.incDead(r, 1);
- s.holdBuffer(r.bufferId());
- s.transferHoldLists(100);
- MemoryUsage m = s.getMemoryUsage();
- EXPECT_EQUAL(MyRef::offsetSize() * sizeof(int), m.allocatedBytes());
- EXPECT_EQUAL(5 * sizeof(int), m.usedBytes());
- EXPECT_EQUAL(2 * sizeof(int), m.deadBytes());
- EXPECT_EQUAL(3 * sizeof(int), m.allocatedBytesOnHold());
- s.trimHoldLists(101);
-}
-
-
-void
-Test::requireThatWecanDisableElemHoldList(void)
-{
- MyStore s;
- MyRef r1 = s.addEntry(10);
- MyRef r2 = s.addEntry(20);
- MyRef r3 = s.addEntry(30);
- (void) r3;
- MemoryUsage m = s.getMemoryUsage();
- EXPECT_EQUAL(MyRef::offsetSize() * sizeof(int), m.allocatedBytes());
- EXPECT_EQUAL(4 * sizeof(int), m.usedBytes());
- EXPECT_EQUAL(1 * sizeof(int), m.deadBytes());
- EXPECT_EQUAL(0 * sizeof(int), m.allocatedBytesOnHold());
- s.holdElem(r1, 1);
- m = s.getMemoryUsage();
- EXPECT_EQUAL(MyRef::offsetSize() * sizeof(int), m.allocatedBytes());
- EXPECT_EQUAL(4 * sizeof(int), m.usedBytes());
- EXPECT_EQUAL(1 * sizeof(int), m.deadBytes());
- EXPECT_EQUAL(1 * sizeof(int), m.allocatedBytesOnHold());
- s.disableElemHoldList();
- s.holdElem(r2, 1);
- m = s.getMemoryUsage();
- EXPECT_EQUAL(MyRef::offsetSize() * sizeof(int), m.allocatedBytes());
- EXPECT_EQUAL(4 * sizeof(int), m.usedBytes());
- EXPECT_EQUAL(2 * sizeof(int), m.deadBytes());
- EXPECT_EQUAL(1 * sizeof(int), m.allocatedBytesOnHold());
- s.transferHoldLists(100);
- s.trimHoldLists(101);
-}
-
-int
-Test::Main()
-{
- TEST_INIT("datastore_test");
-
- requireThatEntryRefIsWorking();
- requireThatAlignedEntryRefIsWorking();
- requireThatEntriesCanBeAddedAndRetrieved();
- requireThatAddEntryTriggersChangeOfBuffer();
- requireThatWeCanHoldAndTrimBuffers();
- requireThatWeCanHoldAndTrimElements();
- requireThatWeCanUseFreeLists();
- requireThatMemoryStatsAreCalculated();
- requireThatMemoryUsageIsCalculated();
- requireThatWecanDisableElemHoldList();
-
- TEST_DONE();
-}
-
-}
-}
-
-TEST_APPHOOK(search::datastore::Test);
-