summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahoo-inc.com>2017-05-08 09:44:16 +0000
committerTor Egge <Tor.Egge@yahoo-inc.com>2017-05-08 09:44:16 +0000
commite97f8c7eef48f3e5c206ef01e745601ceff8bd28 (patch)
treec5dbb5c4eccc4e598216ddf040aef52928fd2ee3 /searchcore
parent0af889ff5ec0e77c2c6a37a9ce95a9d35285a987 (diff)
Test that attribute write operations are spread over available write
contexts.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_test.cpp75
1 files changed, 72 insertions, 3 deletions
diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp
index 4b9d91a6968..173d8dd2a2a 100644
--- a/searchcore/src/tests/proton/attribute/attribute_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp
@@ -21,6 +21,7 @@ LOG_SETUP("attribute_test");
#include <vespa/searchlib/util/filekit.h>
#include <vespa/searchcore/proton/common/hw_info.h>
#include <vespa/vespalib/io/fileutil.h>
+#include <vespa/vespalib/test/insertion_operators.h>
#include <vespa/document/predicate/predicate_slime_builder.h>
#include <vespa/document/update/assignvalueupdate.h>
@@ -30,6 +31,7 @@ LOG_SETUP("attribute_test");
#include <vespa/searchlib/attribute/singlenumericattribute.hpp>
#include <vespa/searchlib/predicate/predicate_hash.h>
#include <vespa/searchlib/common/foregroundtaskexecutor.h>
+#include <vespa/searchlib/common/sequencedtaskexecutorobserver.h>
#include <vespa/searchcore/proton/test/directory_handler.h>
#include <vespa/eval/tensor/tensor.h>
#include <vespa/eval/tensor/types.h>
@@ -102,15 +104,17 @@ struct Fixture
{
test::DirectoryHandler _dirHandler;
DummyFileHeaderContext _fileHeaderContext;
- ForegroundTaskExecutor _attributeFieldWriter;
+ ForegroundTaskExecutor _attributeFieldWriterReal;
+ SequencedTaskExecutorObserver _attributeFieldWriter;
HwInfo _hwInfo;
proton::AttributeManager::SP _m;
std::unique_ptr<AttributeWriter> _aw;
- Fixture()
+ Fixture(uint32_t threads)
: _dirHandler(test_dir),
_fileHeaderContext(),
- _attributeFieldWriter(),
+ _attributeFieldWriterReal(threads),
+ _attributeFieldWriter(_attributeFieldWriterReal),
_hwInfo(),
_m(std::make_shared<proton::AttributeManager>
(test_dir, "test.subdb", TuneFileAttributes(),
@@ -119,6 +123,10 @@ struct Fixture
{
allocAttributeWriter();
}
+ Fixture()
+ : Fixture(1)
+ {
+ }
void allocAttributeWriter() {
_aw = std::make_unique<AttributeWriter>(_m);
}
@@ -144,6 +152,9 @@ struct Fixture
void commit(SerialNum serialNum) {
_aw->commit(serialNum, emptyCallback);
}
+ void assertExecuteHistory(std::vector<uint32_t> expExecuteHistory) {
+ EXPECT_EQUAL(expExecuteHistory, _attributeFieldWriter.getExecuteHistory());
+ }
};
@@ -637,6 +648,64 @@ TEST_F("require that attribute writer handles tensor assign update", Fixture)
}
+namespace {
+
+void
+assertPutDone(AttributeVector &attr, int32_t expVal)
+{
+ EXPECT_EQUAL(2u, attr.getNumDocs());
+ EXPECT_EQUAL(1u, attr.getStatus().getLastSyncToken());
+ attribute::IntegerContent ibuf;
+ ibuf.fill(attr, 1);
+ EXPECT_EQUAL(1u, ibuf.size());
+ EXPECT_EQUAL(expVal, ibuf[0]);
+}
+
+void
+putAttributes(Fixture &f, std::vector<uint32_t> expExecuteHistory)
+{
+ Schema s;
+ s.addAttributeField(Schema::AttributeField("a1", schema::DataType::INT32, CollectionType::SINGLE));
+ s.addAttributeField(Schema::AttributeField("a2", schema::DataType::INT32, CollectionType::SINGLE));
+ s.addAttributeField(Schema::AttributeField("a3", schema::DataType::INT32, CollectionType::SINGLE));
+
+ DocBuilder idb(s);
+
+ AttributeVector::SP a1 = f.addAttribute("a1");
+ AttributeVector::SP a2 = f.addAttribute("a2");
+ AttributeVector::SP a3 = f.addAttribute("a3");
+
+ EXPECT_EQUAL(1u, a1->getNumDocs());
+ EXPECT_EQUAL(1u, a2->getNumDocs());
+ EXPECT_EQUAL(1u, a3->getNumDocs());
+ f.put(1, *idb.startDocument("doc::1").
+ startAttributeField("a1").addInt(10).endField().
+ startAttributeField("a2").addInt(15).endField().
+ startAttributeField("a3").addInt(20).endField().
+ endDocument(), 1);
+ TEST_DO(assertPutDone(*a1, 10));
+ TEST_DO(assertPutDone(*a2, 15));
+ TEST_DO(assertPutDone(*a3, 20));
+ TEST_DO(f.assertExecuteHistory(expExecuteHistory));
+}
+
+}
+
+TEST_F("require that attribute writer spreads write over 1 write context", Fixture(1))
+{
+ TEST_DO(putAttributes(f, {0}));
+}
+
+TEST_F("require that attribute writer spreads write over 2 write contexts", Fixture(2))
+{
+ TEST_DO(putAttributes(f, {0, 1}));
+}
+
+TEST_F("require that attribute writer spreads write over 3 write contexts", Fixture(8))
+{
+ TEST_DO(putAttributes(f, {0, 1, 2}));
+}
+
TEST_MAIN()
{
vespalib::rmdir(test_dir, true);