summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--storage/src/tests/common/teststorageapp.cpp12
-rw-r--r--storage/src/vespa/storage/bucketdb/storbucketdb.cpp16
-rw-r--r--storage/src/vespa/storage/bucketdb/storbucketdb.h2
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space.cpp4
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space.h2
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space_repo.cpp8
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space_repo.h2
-rw-r--r--storage/src/vespa/storage/config/stor-server.def4
-rw-r--r--storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp4
-rw-r--r--storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h2
-rw-r--r--storage/src/vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.cpp2
-rw-r--r--storage/src/vespa/storage/storageserver/servicelayernodecontext.cpp5
-rw-r--r--storage/src/vespa/storage/storageserver/servicelayernodecontext.h3
-rw-r--r--storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp19
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))
{
}