diff options
14 files changed, 54 insertions, 31 deletions
diff --git a/storage/src/tests/common/teststorageapp.cpp b/storage/src/tests/common/teststorageapp.cpp index 082af954871..9fcf1049e1b 100644 --- a/storage/src/tests/common/teststorageapp.cpp +++ b/storage/src/tests/common/teststorageapp.cpp @@ -140,10 +140,8 @@ namespace { } TestServiceLayerApp::TestServiceLayerApp(vespalib::stringref configId) - : TestStorageApp( - StorageComponentRegisterImpl::UP( - new ServiceLayerComponentRegisterImpl), - lib::NodeType::STORAGE, getIndexFromConfig(configId), configId), + : TestStorageApp(std::make_unique<ServiceLayerComponentRegisterImpl>(true), // TODO remove B-tree flag once default + lib::NodeType::STORAGE, getIndexFromConfig(configId), configId), _compReg(dynamic_cast<ServiceLayerComponentRegisterImpl&>( TestStorageApp::getComponentRegister())), _persistenceProvider(), @@ -157,10 +155,8 @@ TestServiceLayerApp::TestServiceLayerApp(vespalib::stringref configId) TestServiceLayerApp::TestServiceLayerApp(DiskCount dc, NodeIndex index, vespalib::stringref configId) - : TestStorageApp( - StorageComponentRegisterImpl::UP( - new ServiceLayerComponentRegisterImpl), - lib::NodeType::STORAGE, index, configId), + : TestStorageApp(std::make_unique<ServiceLayerComponentRegisterImpl>(true), // TODO remove B-tree flag once default + lib::NodeType::STORAGE, index, configId), _compReg(dynamic_cast<ServiceLayerComponentRegisterImpl&>( TestStorageApp::getComponentRegister())), _persistenceProvider(), diff --git a/storage/src/vespa/storage/bucketdb/storbucketdb.cpp b/storage/src/vespa/storage/bucketdb/storbucketdb.cpp index 351fac8a69f..7066ea115fd 100644 --- a/storage/src/vespa/storage/bucketdb/storbucketdb.cpp +++ b/storage/src/vespa/storage/bucketdb/storbucketdb.cpp @@ -38,15 +38,23 @@ operator<<(std::ostream& out, const StorageBucketInfo& info) { return out; } -std::unique_ptr<AbstractBucketMap<StorageBucketInfo>> make_default_db() { +namespace { + +std::unique_ptr<AbstractBucketMap<StorageBucketInfo>> make_legacy_db_impl() { + return std::make_unique<LockableMap<JudyMultiMap<StorageBucketInfo>>>(); +} + +std::unique_ptr<AbstractBucketMap<StorageBucketInfo>> make_btree_db_impl() { return std::make_unique<BTreeLockableMap<StorageBucketInfo>>(); - //return std::make_unique<LockableMap<JudyMultiMap<StorageBucketInfo>>>(); +} + } } // bucketdb -StorBucketDatabase::StorBucketDatabase() - : _impl(bucketdb::make_default_db()) +StorBucketDatabase::StorBucketDatabase(bool use_btree_db) + : _impl(use_btree_db ? bucketdb::make_btree_db_impl() + : bucketdb::make_legacy_db_impl()) {} void diff --git a/storage/src/vespa/storage/bucketdb/storbucketdb.h b/storage/src/vespa/storage/bucketdb/storbucketdb.h index 49349efbaaa..87e5d80c01b 100644 --- a/storage/src/vespa/storage/bucketdb/storbucketdb.h +++ b/storage/src/vespa/storage/bucketdb/storbucketdb.h @@ -23,7 +23,7 @@ public: CREATE_IF_NONEXISTING = 1 }; - StorBucketDatabase(); + explicit StorBucketDatabase(bool use_btree_db = false); void insert(const document::BucketId&, const bucketdb::StorageBucketInfo&, const char* clientId); diff --git a/storage/src/vespa/storage/common/content_bucket_space.cpp b/storage/src/vespa/storage/common/content_bucket_space.cpp index 0827c721100..e293c4bc336 100644 --- a/storage/src/vespa/storage/common/content_bucket_space.cpp +++ b/storage/src/vespa/storage/common/content_bucket_space.cpp @@ -4,9 +4,9 @@ namespace storage { -ContentBucketSpace::ContentBucketSpace(document::BucketSpace bucketSpace) +ContentBucketSpace::ContentBucketSpace(document::BucketSpace bucketSpace, bool use_btree_db) : _bucketSpace(bucketSpace), - _bucketDatabase(), + _bucketDatabase(use_btree_db), _lock(), _clusterState(), _distribution(), diff --git a/storage/src/vespa/storage/common/content_bucket_space.h b/storage/src/vespa/storage/common/content_bucket_space.h index 81ce6234879..bf001f8b6f2 100644 --- a/storage/src/vespa/storage/common/content_bucket_space.h +++ b/storage/src/vespa/storage/common/content_bucket_space.h @@ -26,7 +26,7 @@ private: public: using UP = std::unique_ptr<ContentBucketSpace>; - ContentBucketSpace(document::BucketSpace bucketSpace); + explicit ContentBucketSpace(document::BucketSpace bucketSpace, bool use_btree_db = false); document::BucketSpace bucketSpace() const noexcept { return _bucketSpace; } StorBucketDatabase &bucketDatabase() { return _bucketDatabase; } diff --git a/storage/src/vespa/storage/common/content_bucket_space_repo.cpp b/storage/src/vespa/storage/common/content_bucket_space_repo.cpp index 774ddb81578..2cc03e4d1e5 100644 --- a/storage/src/vespa/storage/common/content_bucket_space_repo.cpp +++ b/storage/src/vespa/storage/common/content_bucket_space_repo.cpp @@ -7,11 +7,13 @@ using document::BucketSpace; namespace storage { -ContentBucketSpaceRepo::ContentBucketSpaceRepo() +ContentBucketSpaceRepo::ContentBucketSpaceRepo(bool use_btree_db) : _map() { - _map.emplace(document::FixedBucketSpaces::default_space(), std::make_unique<ContentBucketSpace>(document::FixedBucketSpaces::default_space())); - _map.emplace(document::FixedBucketSpaces::global_space(), std::make_unique<ContentBucketSpace>(document::FixedBucketSpaces::global_space())); + _map.emplace(document::FixedBucketSpaces::default_space(), + std::make_unique<ContentBucketSpace>(document::FixedBucketSpaces::default_space(), use_btree_db)); + _map.emplace(document::FixedBucketSpaces::global_space(), + std::make_unique<ContentBucketSpace>(document::FixedBucketSpaces::global_space(), use_btree_db)); } ContentBucketSpace & diff --git a/storage/src/vespa/storage/common/content_bucket_space_repo.h b/storage/src/vespa/storage/common/content_bucket_space_repo.h index 3fe99e831bc..142bb5ea1d5 100644 --- a/storage/src/vespa/storage/common/content_bucket_space_repo.h +++ b/storage/src/vespa/storage/common/content_bucket_space_repo.h @@ -19,7 +19,7 @@ private: BucketSpaceMap _map; public: - ContentBucketSpaceRepo(); + explicit ContentBucketSpaceRepo(bool use_btree_db = false); ContentBucketSpace &get(document::BucketSpace bucketSpace) const; BucketSpaceMap::const_iterator begin() const { return _map.begin(); } BucketSpaceMap::const_iterator end() const { return _map.end(); } diff --git a/storage/src/vespa/storage/config/stor-server.def b/storage/src/vespa/storage/config/stor-server.def index 5d303b59d81..e1446aa8ed1 100644 --- a/storage/src/vespa/storage/config/stor-server.def +++ b/storage/src/vespa/storage/config/stor-server.def @@ -84,3 +84,7 @@ bucket_rechecking_chunk_size int default=100 ## full bucket info requests. The latency is added per batch of operations processed. ## Only useful for testing! simulated_bucket_request_latency_msec int default=0 + +## If set, content node processes will use a B-tree backed bucket database implementation +## instead of the legacy Judy-based implementation. +use_content_node_btree_bucket_db bool default=false restart diff --git a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp index 888f1e816a1..da45b61701e 100644 --- a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp +++ b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp @@ -9,9 +9,9 @@ namespace storage { using vespalib::IllegalStateException; -ServiceLayerComponentRegisterImpl::ServiceLayerComponentRegisterImpl() +ServiceLayerComponentRegisterImpl::ServiceLayerComponentRegisterImpl(bool use_btree_db) : _diskCount(0), - _bucketSpaceRepo() + _bucketSpaceRepo(use_btree_db) { } void diff --git a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h index deb3b2c0767..9988b861422 100644 --- a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h +++ b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h @@ -27,7 +27,7 @@ class ServiceLayerComponentRegisterImpl public: typedef std::unique_ptr<ServiceLayerComponentRegisterImpl> UP; - ServiceLayerComponentRegisterImpl(); + ServiceLayerComponentRegisterImpl(bool use_btree_db = false); uint16_t getDiskCount() const { return _diskCount; } ContentBucketSpaceRepo& getBucketSpaceRepo() { return _bucketSpaceRepo; } diff --git a/storage/src/vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.cpp b/storage/src/vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.cpp index 2f66027ccab..654fcbd1380 100644 --- a/storage/src/vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.cpp +++ b/storage/src/vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.cpp @@ -25,7 +25,7 @@ StorageComponentRegisterImpl::StorageComponentRegisterImpl() { } -StorageComponentRegisterImpl::~StorageComponentRegisterImpl() { } +StorageComponentRegisterImpl::~StorageComponentRegisterImpl() = default; void StorageComponentRegisterImpl::registerStorageComponent(StorageComponent& smc) diff --git a/storage/src/vespa/storage/storageserver/servicelayernodecontext.cpp b/storage/src/vespa/storage/storageserver/servicelayernodecontext.cpp index ecd52295d38..bbfc9afc7aa 100644 --- a/storage/src/vespa/storage/storageserver/servicelayernodecontext.cpp +++ b/storage/src/vespa/storage/storageserver/servicelayernodecontext.cpp @@ -4,9 +4,8 @@ namespace storage { -ServiceLayerNodeContext::ServiceLayerNodeContext( - framework::Clock::UP clock) - : StorageNodeContext(StorageComponentRegisterImpl::UP(new ServiceLayerComponentRegisterImpl), +ServiceLayerNodeContext::ServiceLayerNodeContext(framework::Clock::UP clock, bool use_btree_db) + : StorageNodeContext(std::make_unique<ServiceLayerComponentRegisterImpl>(use_btree_db), std::move(clock)), _componentRegister(dynamic_cast<ComponentRegister&>(StorageNodeContext::getComponentRegister())) { diff --git a/storage/src/vespa/storage/storageserver/servicelayernodecontext.h b/storage/src/vespa/storage/storageserver/servicelayernodecontext.h index 9266dc2c7e9..0d7ac5bff69 100644 --- a/storage/src/vespa/storage/storageserver/servicelayernodecontext.h +++ b/storage/src/vespa/storage/storageserver/servicelayernodecontext.h @@ -29,8 +29,7 @@ struct ServiceLayerNodeContext : public StorageNodeContext { * You can provide your own clock implementation. Useful in testing where * you want to fake the clock. */ - ServiceLayerNodeContext( - framework::Clock::UP clock = framework::Clock::UP(new RealClock)); + ServiceLayerNodeContext(framework::Clock::UP clock, bool use_btree_db); /** * Get the actual component register. Available as the actual type as the diff --git a/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp b/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp index bde93b9e4fb..4ff3810d85f 100644 --- a/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp +++ b/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "servicelayerprocess.h" +#include <vespa/config/helper/configgetter.hpp> +#include <vespa/storage/config/config-stor-server.h> #include <vespa/storage/storageserver/servicelayernode.h> #include <vespa/searchvisitor/searchvisitor.h> @@ -9,8 +11,21 @@ LOG_SETUP(".storageserver.service_layer_process"); namespace storage { -ServiceLayerProcess::ServiceLayerProcess(const config::ConfigUri & configUri) - : Process(configUri) +namespace { + +bool configured_to_use_btree_db(const config::ConfigUri& config_uri) { + using vespa::config::content::core::StorServerConfig; + auto server_config = config::ConfigGetter<StorServerConfig>::getConfig( + config_uri.getConfigId(), config_uri.getContext()); + return server_config->useContentNodeBtreeBucketDb; +} + +} + +ServiceLayerProcess::ServiceLayerProcess(const config::ConfigUri& configUri) + : Process(configUri), + _context(std::make_unique<framework::defaultimplementation::RealClock>(), + configured_to_use_btree_db(configUri)) { } |