diff options
author | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-05-12 10:38:37 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-05-12 10:38:37 +0000 |
commit | cd8125caa2b91d42b697a2b29702be35734001bb (patch) | |
tree | a9b1d120b462f6377818645f8d39a385916e7dc3 /searchcore | |
parent | 703129f0917a91c0ae27a5aefce0059477753160 (diff) |
Reuse shrink flush target when transferring attribute to new attribute
manager.
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp | 30 | ||||
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h | 2 |
2 files changed, 19 insertions, 13 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp index c0ac043ebb8..ab6bed8e74d 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp @@ -72,6 +72,17 @@ search::SerialNum estimateShrinkSerialNum(const AttributeVector &attr) return std::max(attr.getStatus().getLastSyncToken(), serialNum); } +std::shared_ptr<ShrinkLidSpaceFlushTarget> allocShrinker(const AttributeVector::SP &attr, search::ISequencedTaskExecutor &attributeFieldWriter) +{ + using Type = IFlushTarget::Type; + using Component = IFlushTarget::Component; + + const vespalib::string &name = attr->getName(); + auto shrinkwrap = std::make_shared<ThreadedCompactableLidSpace>(attr, attributeFieldWriter, attributeFieldWriter.getExecutorId(name)); + search::SerialNum shrinkSerialNum = estimateShrinkSerialNum(*attr); + return std::make_shared<ShrinkLidSpaceFlushTarget>("attributeshrink." + name, Type::GC, Component::ATTRIBUTE, shrinkSerialNum, shrinkwrap); +} + } AttributeManager::AttributeWrap::AttributeWrap(const AttributeVectorSP & a, @@ -128,14 +139,14 @@ AttributeManager::internalAddAttribute(const AttributeSpec &spec, AttributeInitializerResult result = initializer.init(); if (result) { result.getAttribute()->setInterlock(_interlock); - SerialNum shrinkSerialNum = estimateShrinkSerialNum(*result.getAttribute()); - addAttribute(AttributeWrap::normalAttribute(result.getAttribute()), shrinkSerialNum); + auto shrinker = allocShrinker(result.getAttribute(), _attributeFieldWriter); + addAttribute(AttributeWrap::normalAttribute(result.getAttribute()), shrinker); } return result.getAttribute(); } void -AttributeManager::addAttribute(const AttributeWrap &attribute, SerialNum shrinkSerialNum) +AttributeManager::addAttribute(const AttributeWrap &attribute, const ShrinkerSP &shrinker) { LOG(debug, "Adding attribute vector '%s'", attribute.getAttribute()->getBaseFileName().c_str()); _attributes[attribute.getAttribute()->getName()] = attribute; @@ -145,10 +156,6 @@ AttributeManager::addAttribute(const AttributeWrap &attribute, SerialNum shrinkS auto attr = attribute.getAttribute(); const vespalib::string &name = attr->getName(); auto flusher = std::make_shared<FlushableAttribute>(attr, _diskLayout->createAttributeDir(name), _tuneFileAttributes, _fileHeaderContext, _attributeFieldWriter, _hwInfo); - auto shrinkwrap = std::make_shared<ThreadedCompactableLidSpace>(attr, _attributeFieldWriter, _attributeFieldWriter.getExecutorId(name)); - using Type = IFlushTarget::Type; - using Component = IFlushTarget::Component; - auto shrinker = std::make_shared<ShrinkLidSpaceFlushTarget>("attributeshrink." + name, Type::GC, Component::ATTRIBUTE, shrinkSerialNum, attr); _flushables[attribute.getAttribute()->getName()] = FlushableWrap(flusher, shrinker); _writableAttributes.push_back(attribute.getAttribute().get()); } @@ -184,8 +191,7 @@ AttributeManager::transferExistingAttributes(const AttributeManager &currMgr, assert(wrap != nullptr); auto shrinker = wrap->getShrinker(); assert(shrinker); - SerialNum shrinkSerialNum = shrinker->getFlushedSerialNum(); - addAttribute(AttributeWrap::normalAttribute(av), shrinkSerialNum); + addAttribute(AttributeWrap::normalAttribute(av), shrinker); } else { toBeAdded.push_back(aspec); } @@ -316,8 +322,8 @@ AttributeManager::addInitializedAttributes(const std::vector<AttributeInitialize assert(result); auto attr = result.getAttribute(); attr->setInterlock(_interlock); - SerialNum shrinkSerialNum = estimateShrinkSerialNum(*attr); - addAttribute(AttributeWrap::normalAttribute(attr), shrinkSerialNum); + auto shrinker = allocShrinker(attr, _attributeFieldWriter); + addAttribute(AttributeWrap::normalAttribute(attr), shrinker); } } @@ -325,7 +331,7 @@ void AttributeManager::addExtraAttribute(const AttributeVector::SP &attribute) { attribute->setInterlock(_interlock); - addAttribute(AttributeWrap::extraAttribute(attribute), 0); + addAttribute(AttributeWrap::extraAttribute(attribute), ShrinkerSP()); } void diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h index ca07a5e766f..4faa3011a1d 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h @@ -98,7 +98,7 @@ private: uint64_t serialNum, const IAttributeFactory &factory); - void addAttribute(const AttributeWrap &attribute, SerialNum shrinkSerialNum); + void addAttribute(const AttributeWrap &attribute, const ShrinkerSP &shrinker); AttributeVectorSP findAttribute(const vespalib::string &name) const; |