summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2018-01-22 12:47:29 +0000
committerGeir Storli <geirst@oath.com>2018-01-22 12:47:29 +0000
commit6b8cccc45e2580298f48462d9341e32a1ae22b8f (patch)
tree8bd71b7b6d74c2e41a19f1abe4eae8671efd80f3
parenteac3947f1275207660547f040b69127c18c08bff (diff)
Add config for the alloc grow factor used when allocating buffers in multi-value attributes.
-rw-r--r--searchcommon/src/vespa/searchcommon/common/growstrategy.h35
-rw-r--r--searchcore/src/vespa/searchcore/config/proton.def4
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp21
-rw-r--r--searchlib/src/tests/attribute/attribute_test.cpp10
-rw-r--r--searchlib/src/tests/attribute/searchcontext/searchcontext.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp3
6 files changed, 53 insertions, 24 deletions
diff --git a/searchcommon/src/vespa/searchcommon/common/growstrategy.h b/searchcommon/src/vespa/searchcommon/common/growstrategy.h
index 920e07e99f1..a0431b16d51 100644
--- a/searchcommon/src/vespa/searchcommon/common/growstrategy.h
+++ b/searchcommon/src/vespa/searchcommon/common/growstrategy.h
@@ -12,27 +12,40 @@ private:
uint32_t _docsInitialCapacity;
uint32_t _docsGrowPercent;
uint32_t _docsGrowDelta;
+ float _multiValueAllocGrowFactor;
public:
- GrowStrategy(uint32_t docsInitialCapacity = 1024,
- uint32_t docsGrowPercent = 50,
- uint32_t docsGrowDelta = 0)
+ GrowStrategy()
+ : GrowStrategy(1024, 50, 0, 0.2)
+ {}
+ GrowStrategy(uint32_t docsInitialCapacity,
+ uint32_t docsGrowPercent,
+ uint32_t docsGrowDelta,
+ float multiValueAllocGrowFactor)
: _docsInitialCapacity(docsInitialCapacity),
_docsGrowPercent(docsGrowPercent),
- _docsGrowDelta(docsGrowDelta)
+ _docsGrowDelta(docsGrowDelta),
+ _multiValueAllocGrowFactor(multiValueAllocGrowFactor)
{
}
- uint32_t getDocsInitialCapacity() const { return _docsInitialCapacity; }
- uint32_t getDocsGrowPercent() const { return _docsGrowPercent; }
- uint32_t getDocsGrowDelta() const { return _docsGrowDelta; }
- void setDocsInitialCapacity(uint32_t v) { _docsInitialCapacity = v; }
- void setDocsGrowPercent(uint32_t v) { _docsGrowPercent = v; }
- void setDocsGrowDelta(uint32_t v) { _docsGrowDelta = v; }
+ static GrowStrategy make(uint32_t docsInitialCapacity,
+ uint32_t docsGrowPercent,
+ uint32_t docsGrowDelta) {
+ return GrowStrategy(docsInitialCapacity, docsGrowPercent, docsGrowDelta, 0.2);
+ }
+
+ uint32_t getDocsInitialCapacity() const { return _docsInitialCapacity; }
+ uint32_t getDocsGrowPercent() const { return _docsGrowPercent; }
+ uint32_t getDocsGrowDelta() const { return _docsGrowDelta; }
+ float getMultiValueAllocGrowFactor() const { return _multiValueAllocGrowFactor; }
+ void setDocsInitialCapacity(uint32_t v) { _docsInitialCapacity = v; }
+ void setDocsGrowDelta(uint32_t v) { _docsGrowDelta = v; }
bool operator==(const GrowStrategy & rhs) const {
return _docsInitialCapacity == rhs._docsInitialCapacity &&
_docsGrowPercent == rhs._docsGrowPercent &&
- _docsGrowDelta == rhs._docsGrowDelta;
+ _docsGrowDelta == rhs._docsGrowDelta &&
+ _multiValueAllocGrowFactor == rhs._multiValueAllocGrowFactor;
}
bool operator!=(const GrowStrategy & rhs) const {
return !(operator==(rhs));
diff --git a/searchcore/src/vespa/searchcore/config/proton.def b/searchcore/src/vespa/searchcore/config/proton.def
index f46f6c67fd4..d7b1cbfa45f 100644
--- a/searchcore/src/vespa/searchcore/config/proton.def
+++ b/searchcore/src/vespa/searchcore/config/proton.def
@@ -205,6 +205,10 @@ grow.add int default=1 restart
## The number of documents to amortize memory spike cost over
grow.numdocs int default=10000 restart
+## The grow factor used when allocating buffers in the array store
+## used in multi-value attribute vectors to store underlying values.
+grow.multivalueallocfactor double default=0.2 restart
+
## Control cache size in bytes.
summary.cache.maxbytes long default=0
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp b/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp
index 4c1dd47569b..46233af1a45 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp
@@ -11,12 +11,25 @@
#include <vespa/searchcore/proton/metrics/documentdb_metrics_collection.h>
using proton::matching::SessionManager;
-using search::index::Schema;
+using search::GrowStrategy;
using search::SerialNum;
+using search::index::Schema;
using searchcorespi::IFlushTarget;
namespace proton {
+namespace {
+
+GrowStrategy
+makeGrowStrategy(uint32_t docsInitialCapacity,
+ const DocumentSubDBCollection::ProtonConfig::Grow &growCfg)
+{
+ return GrowStrategy(docsInitialCapacity, growCfg.factor,
+ growCfg.add, growCfg.multivalueallocfactor);
+}
+
+}
+
DocumentSubDBCollection::DocumentSubDBCollection(
IDocumentSubDBOwner &owner,
search::transactionlog::SyncProxy &tlSyncer,
@@ -49,9 +62,9 @@ DocumentSubDBCollection::DocumentSubDBCollection(
const ProtonConfig::Distribution & distCfg = protonCfg.distribution;
_bucketDB = std::make_shared<BucketDBOwner>();
_bucketDBHandler.reset(new bucketdb::BucketDBHandler(*_bucketDB));
- search::GrowStrategy searchableGrowth(growCfg.initial * distCfg.searchablecopies, growCfg.factor, growCfg.add);
- search::GrowStrategy removedGrowth(std::max(1024l, growCfg.initial/100), growCfg.factor, growCfg.add);
- search::GrowStrategy notReadyGrowth(growCfg.initial * (distCfg.redundancy - distCfg.searchablecopies), growCfg.factor, growCfg.add);
+ GrowStrategy searchableGrowth = makeGrowStrategy(growCfg.initial * distCfg.searchablecopies, growCfg);
+ GrowStrategy removedGrowth = makeGrowStrategy(std::max(1024l, growCfg.initial/100), growCfg);
+ GrowStrategy notReadyGrowth = makeGrowStrategy(growCfg.initial * (distCfg.redundancy - distCfg.searchablecopies), growCfg);
size_t attributeGrowNumDocs(growCfg.numdocs);
size_t numSearcherThreads = protonCfg.numsearcherthreads;
diff --git a/searchlib/src/tests/attribute/attribute_test.cpp b/searchlib/src/tests/attribute/attribute_test.cpp
index b406afa7e7b..9134711773c 100644
--- a/searchlib/src/tests/attribute/attribute_test.cpp
+++ b/searchlib/src/tests/attribute/attribute_test.cpp
@@ -1955,27 +1955,27 @@ AttributeTest::testGeneration()
{
{ // single value attribute
Config cfg(BasicType::INT8);
- cfg.setGrowStrategy(GrowStrategy(2, 0, 2));
+ cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2));
AttributePtr attr = createAttribute("int8", cfg);
testGeneration(attr, true);
}
{ // enum attribute (with fast search)
Config cfg(BasicType::INT8);
cfg.setFastSearch(true);
- cfg.setGrowStrategy(GrowStrategy(2, 0, 2));
+ cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2));
AttributePtr attr = createAttribute("faint8", cfg);
testGeneration(attr, false);
}
{ // multi value attribute
Config cfg(BasicType::INT8, CollectionType::ARRAY);
- cfg.setGrowStrategy(GrowStrategy(2, 0, 2));
+ cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2));
AttributePtr attr = createAttribute("aint8", cfg);
testGeneration(attr, false);
}
{ // multi value enum attribute (with fast search)
Config cfg(BasicType::INT8, CollectionType::ARRAY);
cfg.setFastSearch(true);
- cfg.setGrowStrategy(GrowStrategy(2, 0, 2));
+ cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2));
AttributePtr attr = createAttribute("faaint8", cfg);
testGeneration(attr, false);
}
@@ -2245,7 +2245,7 @@ AttributeTest::testReaderDuringLastUpdate(const Config &config, bool fs, bool co
vespalib::string name(ss.str());
Config cfg = config;
cfg.setFastSearch(fs);
- cfg.setGrowStrategy(GrowStrategy(100, 50, 0));
+ cfg.setGrowStrategy(GrowStrategy::make(100, 50, 0));
LOG(info, "testReaderDuringLastUpdate(%s)", name.c_str());
AttributePtr attr = AttributeFactory::createAttribute(name, cfg);
diff --git a/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp b/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp
index 9829ff27104..cbc86b02ada 100644
--- a/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp
+++ b/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp
@@ -1622,7 +1622,7 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded()
Config cfg(BasicType::INT8, CollectionType::ARRAY);
cfg.setFastSearch(true);
{
- cfg.setGrowStrategy(GrowStrategy(1, 0, 1));
+ cfg.setGrowStrategy(GrowStrategy::make(1, 0, 1));
AttributePtr a = AttributeFactory::createAttribute("flags", cfg);
FlagAttribute & fa = dynamic_cast<FlagAttribute &>(*a);
addReservedDoc(fa);
@@ -1657,7 +1657,7 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded()
}
}
{
- cfg.setGrowStrategy(GrowStrategy(4, 0, 4));
+ cfg.setGrowStrategy(GrowStrategy::make(4, 0, 4));
AttributePtr a = AttributeFactory::createAttribute("flags", cfg);
FlagAttribute & fa = dynamic_cast<FlagAttribute &>(*a);
std::vector<uint32_t> exp50;
diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp
index 6632ca730c4..b9042ac5f6c 100644
--- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp
@@ -10,7 +10,6 @@ namespace multivalueattribute {
constexpr size_t HUGE_MEMORY_PAGE_SIZE = 2 * 1024 * 1024;
constexpr size_t SMALL_MEMORY_PAGE_SIZE = 4 * 1024;
-constexpr float ALLOC_GROW_FACTOR = 0.2;
}
@@ -23,7 +22,7 @@ MultiValueAttribute(const vespalib::string &baseFileName,
multivalueattribute::HUGE_MEMORY_PAGE_SIZE,
multivalueattribute::SMALL_MEMORY_PAGE_SIZE,
8 * 1024,
- multivalueattribute::ALLOC_GROW_FACTOR),
+ cfg.getGrowStrategy().getMultiValueAllocGrowFactor()),
cfg.getGrowStrategy())
{
}