diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-10-18 12:54:07 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-10-18 12:54:07 +0000 |
commit | b17c5c96e18ae04a1b39b4d0ec3dc89832038c05 (patch) | |
tree | f401ff833fcfaf0dee1852c169671e382b5ed48b /storage | |
parent | a7f45c9843e197c5881ef67fa83e1d23c78daa17 (diff) |
Do not retrieve config once for every thread.
Diffstat (limited to 'storage')
11 files changed, 38 insertions, 40 deletions
diff --git a/storage/src/tests/persistence/filestorage/filestormanagertest.cpp b/storage/src/tests/persistence/filestorage/filestormanagertest.cpp index ec86c8db679..761888e9f9b 100644 --- a/storage/src/tests/persistence/filestorage/filestormanagertest.cpp +++ b/storage/src/tests/persistence/filestorage/filestormanagertest.cpp @@ -202,7 +202,8 @@ createThread(vdstestlib::DirConfig& config, FileStorThreadMetrics& metrics) { (void) config; - return std::make_unique<PersistenceThread>(node.executor(), node.getComponentRegister(), config.getConfigId(), + vespa::config::content::StorFilestorConfig cfg; + return std::make_unique<PersistenceThread>(node.executor(), node.getComponentRegister(), cfg, provider, filestorHandler, notifier, metrics); } diff --git a/storage/src/tests/persistence/persistencetestutils.cpp b/storage/src/tests/persistence/persistencetestutils.cpp index 8d06f25319d..e2d61b9db2c 100644 --- a/storage/src/tests/persistence/persistencetestutils.cpp +++ b/storage/src/tests/persistence/persistencetestutils.cpp @@ -56,7 +56,7 @@ PersistenceTestEnvironment::PersistenceTestEnvironment(const std::string & rootO _node.setupDummyPersistence(); _metrics.initDiskMetrics(1, _node.getLoadTypes()->getMetricLoadTypes(), 1, 1); _handler = std::make_unique<FileStorHandlerImpl>(_messageKeeper, _metrics, _node.getComponentRegister()); - _diskEnv = std::make_unique<PersistenceUtil>(_config.getConfigId(), _component, *_handler, + _diskEnv = std::make_unique<PersistenceUtil>(_component, *_handler, *_metrics.disks[0]->threads[0], _node.getPersistenceProvider()); } @@ -89,8 +89,9 @@ PersistenceTestUtils::setupExecutor(uint32_t numThreads) { std::unique_ptr<PersistenceThread> PersistenceTestUtils::createPersistenceThread() { + vespa::config::content::StorFilestorConfig cfg; return std::make_unique<PersistenceThread>(*_sequenceTaskExecutor, _env->_node.getComponentRegister(), - _env->_config.getConfigId(),getPersistenceProvider(), + cfg, getPersistenceProvider(), getEnv()._fileStorHandler, _bucketOwnershipNotifier, getEnv()._metrics); } diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp index 6c2cebfeb19..98b95c16b78 100644 --- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp +++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp @@ -133,7 +133,7 @@ FileStorManager::configure(std::unique_ptr<vespa::config::content::StorFilestorC assert(_sequencedExecutor); LOG(spam, "Setting up the disk"); for (uint32_t j = 0; j < numThreads; j++) { - _threads.push_back(std::make_shared<PersistenceThread>(*_sequencedExecutor, _compReg, _configUri, *_provider, + _threads.push_back(std::make_shared<PersistenceThread>(*_sequencedExecutor, _compReg, *_config, *_provider, *_filestorHandler, *_bucketOwnershipNotifier, *_metrics->disks[0]->threads[j])); } } diff --git a/storage/src/vespa/storage/persistence/mergehandler.cpp b/storage/src/vespa/storage/persistence/mergehandler.cpp index b2904c6d67b..44ebe4c0901 100644 --- a/storage/src/vespa/storage/persistence/mergehandler.cpp +++ b/storage/src/vespa/storage/persistence/mergehandler.cpp @@ -14,21 +14,16 @@ LOG_SETUP(".persistence.mergehandler"); namespace storage { -MergeHandler::MergeHandler(PersistenceUtil& env, spi::PersistenceProvider& spi) +MergeHandler::MergeHandler(PersistenceUtil& env, spi::PersistenceProvider& spi, uint32_t maxChunkSize, + bool enableMergeLocalNodeChooseDocsOptimalization, + uint32_t commonMergeChainOptimalizationMinimumSize) : _clock(env._component.getClock()), _clusterName(env._component.getClusterName()), _env(env), _spi(spi), - _maxChunkSize(env._config.bucketMergeChunkSize) -{ -} - -MergeHandler::MergeHandler(PersistenceUtil& env, spi::PersistenceProvider& spi, uint32_t maxChunkSize) - : _clock(env._component.getClock()), - _clusterName(env._component.getClusterName()), - _env(env), - _spi(spi), - _maxChunkSize(maxChunkSize) + _maxChunkSize(maxChunkSize), + _enableMergeLocalNodeChooseDocsOptimalization(enableMergeLocalNodeChooseDocsOptimalization), + _commonMergeChainOptimalizationMinimumSize(commonMergeChainOptimalizationMinimumSize) { } @@ -724,7 +719,7 @@ MergeHandler::processBucketMerge(const spi::Bucket& bucket, MergeStatus& status, // Add all the metadata, and thus use big limit. Max // data to fetch parameter will control amount added. uint32_t maxSize = - (_env._config.enableMergeLocalNodeChooseDocsOptimalization + (_enableMergeLocalNodeChooseDocsOptimalization ? std::numeric_limits<uint32_t>::max() : _maxChunkSize); @@ -763,7 +758,7 @@ MergeHandler::processBucketMerge(const spi::Bucket& bucket, MergeStatus& status, ++counts[e._hasMask]; } for (const auto& e : counts) { - if (e.second >= uint32_t(_env._config.commonMergeChainOptimalizationMinimumSize) + if (e.second >= uint32_t(_commonMergeChainOptimalizationMinimumSize) || counts.size() == 1) { LOG(spam, "Sending separate apply bucket diff for path %x " @@ -793,7 +788,7 @@ MergeHandler::processBucketMerge(const spi::Bucket& bucket, MergeStatus& status, } assert(nodes.size() > 1); uint32_t maxSize = - (_env._config.enableMergeLocalNodeChooseDocsOptimalization + (_enableMergeLocalNodeChooseDocsOptimalization ? std::numeric_limits<uint32_t>::max() : _maxChunkSize); cmd = std::make_shared<api::ApplyBucketDiffCommand>(bucket.getBucket(), nodes, maxSize); diff --git a/storage/src/vespa/storage/persistence/mergehandler.h b/storage/src/vespa/storage/persistence/mergehandler.h index 0fca56f639d..9f74a6b93df 100644 --- a/storage/src/vespa/storage/persistence/mergehandler.h +++ b/storage/src/vespa/storage/persistence/mergehandler.h @@ -34,9 +34,10 @@ public: DELETED_IN_PLACE = 0x04 }; - MergeHandler(PersistenceUtil&, spi::PersistenceProvider& spi); - /** Used for unit testing */ - MergeHandler(PersistenceUtil& env, spi::PersistenceProvider& spi, uint32_t maxChunkSize); + MergeHandler(PersistenceUtil& env, spi::PersistenceProvider& spi, + uint32_t maxChunkSize = 4190208, + bool enableMergeLocalNodeChooseDocsOptimalization = true, + uint32_t commonMergeChainOptimalizationMinimumSize = 64); bool buildBucketInfoList( const spi::Bucket& bucket, @@ -69,6 +70,8 @@ private: PersistenceUtil &_env; spi::PersistenceProvider &_spi; uint32_t _maxChunkSize; + bool _enableMergeLocalNodeChooseDocsOptimalization; + uint32_t _commonMergeChainOptimalizationMinimumSize; /** Returns a reply if merge is complete */ api::StorageReply::SP processBucketMerge(const spi::Bucket& bucket, diff --git a/storage/src/vespa/storage/persistence/persistencethread.cpp b/storage/src/vespa/storage/persistence/persistencethread.cpp index bfa23af5858..6602e9ece4a 100644 --- a/storage/src/vespa/storage/persistence/persistencethread.cpp +++ b/storage/src/vespa/storage/persistence/persistencethread.cpp @@ -31,19 +31,21 @@ createThreadName(size_t stripeId) { PersistenceThread::PersistenceThread(vespalib::ISequencedTaskExecutor & sequencedExecutor, ServiceLayerComponentRegister& compReg, - const config::ConfigUri & configUri, + const vespa::config::content::StorFilestorConfig & cfg, spi::PersistenceProvider& provider, FileStorHandler& filestorHandler, BucketOwnershipNotifier & bucketOwnershipNotifier, FileStorThreadMetrics& metrics) : _stripeId(filestorHandler.getNextStripeId()), _component(std::make_unique<ServiceLayerComponent>(compReg, createThreadName(_stripeId))), - _env(configUri, *_component, filestorHandler, metrics, provider), + _env(*_component, filestorHandler, metrics, provider), _spi(provider), _processAllHandler(_env, provider), - _mergeHandler(_env, _spi), + _mergeHandler(_env, _spi, cfg.bucketMergeChunkSize, + cfg.enableMergeLocalNodeChooseDocsOptimalization, + cfg.commonMergeChainOptimalizationMinimumSize), _asyncHandler(_env, _spi, sequencedExecutor), - _splitJoinHandler(_env, provider, bucketOwnershipNotifier), + _splitJoinHandler(_env, provider, bucketOwnershipNotifier, cfg.enableMultibitSplitOptimalization), _thread() { _thread = _component->startThread(*this, 60s, 1s); diff --git a/storage/src/vespa/storage/persistence/persistencethread.h b/storage/src/vespa/storage/persistence/persistencethread.h index 6afb58dfc4e..969a17768e2 100644 --- a/storage/src/vespa/storage/persistence/persistencethread.h +++ b/storage/src/vespa/storage/persistence/persistencethread.h @@ -13,6 +13,7 @@ #include <vespa/storage/common/storagecomponent.h> #include <vespa/storage/common/statusmessages.h> #include <vespa/vespalib/util/isequencedtaskexecutor.h> +#include <vespa/config-stor-filestor.h> namespace storage { @@ -22,7 +23,7 @@ class PersistenceThread final : public DiskThread, public Types { public: PersistenceThread(vespalib::ISequencedTaskExecutor &, ServiceLayerComponentRegister &, - const config::ConfigUri &, spi::PersistenceProvider &, + const vespa::config::content::StorFilestorConfig &, spi::PersistenceProvider &, FileStorHandler &, BucketOwnershipNotifier &, FileStorThreadMetrics&); ~PersistenceThread() override; diff --git a/storage/src/vespa/storage/persistence/persistenceutil.cpp b/storage/src/vespa/storage/persistence/persistenceutil.cpp index 59baf3b4fd3..ba074003b80 100644 --- a/storage/src/vespa/storage/persistence/persistenceutil.cpp +++ b/storage/src/vespa/storage/persistence/persistenceutil.cpp @@ -1,8 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "persistenceutil.h" -#include <vespa/config/config.h> -#include <vespa/config/helper/configgetter.hpp> #include <vespa/vespalib/util/exceptions.h> #include <vespa/log/bufferedlogger.h> @@ -157,13 +155,11 @@ MessageTracker::generateReply(api::StorageCommand& cmd) } PersistenceUtil::PersistenceUtil( - const config::ConfigUri & configUri, ServiceLayerComponent& component, FileStorHandler& fileStorHandler, FileStorThreadMetrics& metrics, spi::PersistenceProvider& provider) - : _config(*config::ConfigGetter<vespa::config::content::StorFilestorConfig>::getConfig(configUri.getConfigId(), configUri.getContext())), - _component(component), + : _component(component), _fileStorHandler(fileStorHandler), _nodeIndex(component.getIndex()), _metrics(metrics), diff --git a/storage/src/vespa/storage/persistence/persistenceutil.h b/storage/src/vespa/storage/persistence/persistenceutil.h index a98bc1e4e9a..e27419ccc1f 100644 --- a/storage/src/vespa/storage/persistence/persistenceutil.h +++ b/storage/src/vespa/storage/persistence/persistenceutil.h @@ -8,8 +8,6 @@ #include <vespa/storage/persistence/filestorage/filestormetrics.h> #include <vespa/vespalib/io/fileutil.h> #include <vespa/storage/storageutil/utils.h> -#include <vespa/config-stor-filestor.h> -#include <vespa/persistence/spi/persistenceprovider.h> namespace storage { @@ -95,7 +93,6 @@ private: }; struct PersistenceUtil { - vespa::config::content::StorFilestorConfig _config; ServiceLayerComponent &_component; FileStorHandler &_fileStorHandler; uint16_t _nodeIndex; @@ -104,7 +101,6 @@ struct PersistenceUtil { spi::PersistenceProvider &_spi; PersistenceUtil( - const config::ConfigUri&, ServiceLayerComponent&, FileStorHandler& fileStorHandler, FileStorThreadMetrics& metrics, diff --git a/storage/src/vespa/storage/persistence/splitjoinhandler.cpp b/storage/src/vespa/storage/persistence/splitjoinhandler.cpp index 5b66ffa5929..31f4f8055d5 100644 --- a/storage/src/vespa/storage/persistence/splitjoinhandler.cpp +++ b/storage/src/vespa/storage/persistence/splitjoinhandler.cpp @@ -13,10 +13,11 @@ LOG_SETUP(".persistence.splitjoinhandler"); namespace storage { SplitJoinHandler::SplitJoinHandler(PersistenceUtil & env, spi::PersistenceProvider & spi, - BucketOwnershipNotifier & notifier) + BucketOwnershipNotifier & notifier, bool enableMultibitSplitOptimalization) : _env(env), _spi(spi), - _bucketOwnershipNotifier(notifier) + _bucketOwnershipNotifier(notifier), + _enableMultibitSplitOptimalization(enableMultibitSplitOptimalization) { } @@ -40,11 +41,11 @@ SplitJoinHandler::handleSplitBucket(api::SplitBucketCommand& cmd, MessageTracker spi::Bucket spiBucket(cmd.getBucket()); SplitBitDetector::Result targetInfo; - if (_env._config.enableMultibitSplitOptimalization) { + if (_enableMultibitSplitOptimalization) { targetInfo = SplitBitDetector::detectSplit(_spi, spiBucket, cmd.getMaxSplitBits(), tracker->context(), cmd.getMinDocCount(), cmd.getMinByteSize()); } - if (targetInfo.empty() || !_env._config.enableMultibitSplitOptimalization) { + if (targetInfo.empty() || !_enableMultibitSplitOptimalization) { document::BucketId src(cmd.getBucketId()); document::BucketId target1(src.getUsedBits() + 1, src.getId()); document::BucketId target2(src.getUsedBits() + 1, src.getId() | (uint64_t(1) << src.getUsedBits())); diff --git a/storage/src/vespa/storage/persistence/splitjoinhandler.h b/storage/src/vespa/storage/persistence/splitjoinhandler.h index b1593931b8f..0d7f593c762 100644 --- a/storage/src/vespa/storage/persistence/splitjoinhandler.h +++ b/storage/src/vespa/storage/persistence/splitjoinhandler.h @@ -18,7 +18,8 @@ class RecheckBucketInfoCommand; */ class SplitJoinHandler : public Types { public: - SplitJoinHandler(PersistenceUtil &, spi::PersistenceProvider &, BucketOwnershipNotifier &); + SplitJoinHandler(PersistenceUtil &, spi::PersistenceProvider &, + BucketOwnershipNotifier &, bool enableMultibitSplitOptimalization); MessageTrackerUP handleSplitBucket(api::SplitBucketCommand& cmd, MessageTrackerUP tracker) const; MessageTrackerUP handleSetBucketState(api::SetBucketStateCommand& cmd, MessageTrackerUP tracker) const; MessageTrackerUP handleRecheckBucketInfo(RecheckBucketInfoCommand& cmd, MessageTrackerUP tracker) const; @@ -26,6 +27,7 @@ private: PersistenceUtil &_env; spi::PersistenceProvider &_spi; BucketOwnershipNotifier &_bucketOwnershipNotifier; + bool _enableMultibitSplitOptimalization; }; } // storage |