diff options
author | Tor Brede Vekterli <vekterli@oath.com> | 2017-11-02 13:51:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-02 13:51:37 +0100 |
commit | 719cf8af520257638d050be199a31b724622125d (patch) | |
tree | 01b8da9c34349506301e3ce484ebbbaa29f19dc3 /storage | |
parent | 220b9ce4c63a3a51cd6db0ae9a23128b076eb1e9 (diff) | |
parent | a6753ddae21efca86788dc0c91eddc755ae167b5 (diff) |
Merge pull request #3980 from vespa-engine/geirst/add-content-bucket-space-repo
Add repo for all bucket spaces (with associated bucket databases) on …
Diffstat (limited to 'storage')
10 files changed, 100 insertions, 13 deletions
diff --git a/storage/src/tests/common/teststorageapp.h b/storage/src/tests/common/teststorageapp.h index 268ba7aafdc..6906d41ac47 100644 --- a/storage/src/tests/common/teststorageapp.h +++ b/storage/src/tests/common/teststorageapp.h @@ -125,7 +125,9 @@ public: spi::PartitionStateList& getPartitions(); uint16_t getPartition(const document::BucketId&); - StorBucketDatabase& getStorageBucketDatabase() override { return _compReg.getBucketDatabase(); } + StorBucketDatabase& getStorageBucketDatabase() override { + return _compReg.getBucketSpaceRepo().get(document::BucketSpace::placeHolder()).bucketDatabase(); + } private: // For storage server interface implementation we'll get rid of soon. diff --git a/storage/src/vespa/storage/common/CMakeLists.txt b/storage/src/vespa/storage/common/CMakeLists.txt index 59e27307c77..b98058b3c3d 100644 --- a/storage/src/vespa/storage/common/CMakeLists.txt +++ b/storage/src/vespa/storage/common/CMakeLists.txt @@ -3,6 +3,8 @@ vespa_add_library(storage_common OBJECT SOURCES bucketmessages.cpp bucketoperationlogger.cpp + content_bucket_space.cpp + content_bucket_space_repo.cpp distributorcomponent.cpp messagebucket.cpp messagesender.cpp diff --git a/storage/src/vespa/storage/common/content_bucket_space.cpp b/storage/src/vespa/storage/common/content_bucket_space.cpp new file mode 100644 index 00000000000..b78be81c9de --- /dev/null +++ b/storage/src/vespa/storage/common/content_bucket_space.cpp @@ -0,0 +1,12 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "content_bucket_space.h" + +namespace storage { + +ContentBucketSpace::ContentBucketSpace() + : _bucketDatabase() +{ +} + +} diff --git a/storage/src/vespa/storage/common/content_bucket_space.h b/storage/src/vespa/storage/common/content_bucket_space.h new file mode 100644 index 00000000000..2efb2eca06d --- /dev/null +++ b/storage/src/vespa/storage/common/content_bucket_space.h @@ -0,0 +1,21 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#pragma once + +#include <vespa/storage/bucketdb/storbucketdb.h> + +namespace storage { + +/** + * Class representing a bucket space (with associated bucket database) on a content node. + */ +class ContentBucketSpace { +private: + StorBucketDatabase _bucketDatabase; + +public: + using UP = std::unique_ptr<ContentBucketSpace>; + ContentBucketSpace(); + 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 new file mode 100644 index 00000000000..74a2b912602 --- /dev/null +++ b/storage/src/vespa/storage/common/content_bucket_space_repo.cpp @@ -0,0 +1,24 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "content_bucket_space_repo.h" + +using document::BucketSpace; + +namespace storage { + +ContentBucketSpaceRepo::ContentBucketSpaceRepo() + : _map() +{ + _map.emplace(BucketSpace::placeHolder(), std::make_unique<ContentBucketSpace>()); +} + +ContentBucketSpace & +ContentBucketSpaceRepo::get(BucketSpace bucketSpace) const +{ + assert(bucketSpace == BucketSpace::placeHolder()); + auto itr = _map.find(bucketSpace); + assert(itr != _map.end()); + return *itr->second; +} + +} diff --git a/storage/src/vespa/storage/common/content_bucket_space_repo.h b/storage/src/vespa/storage/common/content_bucket_space_repo.h new file mode 100644 index 00000000000..258edf2d0c9 --- /dev/null +++ b/storage/src/vespa/storage/common/content_bucket_space_repo.h @@ -0,0 +1,24 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#pragma once + +#include "content_bucket_space.h" +#include <vespa/document/bucket/bucketspace.h> +#include <unordered_map> + +namespace storage { + +/** + * Class managing the set of bucket spaces (with associated bucket databases) on a content node. + */ +class ContentBucketSpaceRepo { +private: + using BucketSpaceMap = std::unordered_map<document::BucketSpace, ContentBucketSpace::UP, document::BucketSpace::hash>; + + BucketSpaceMap _map; + +public: + ContentBucketSpaceRepo(); + ContentBucketSpace &get(document::BucketSpace bucketSpace) const; +}; + +} diff --git a/storage/src/vespa/storage/common/servicelayercomponent.cpp b/storage/src/vespa/storage/common/servicelayercomponent.cpp index a5f33fb28b8..72f65ebaee1 100644 --- a/storage/src/vespa/storage/common/servicelayercomponent.cpp +++ b/storage/src/vespa/storage/common/servicelayercomponent.cpp @@ -2,6 +2,7 @@ #include "servicelayercomponent.h" +#include <vespa/storage/common/content_bucket_space_repo.h> #include <vespa/storage/common/nodestateupdater.h> #include <vespa/vdslib/distribution/distribution.h> @@ -13,8 +14,8 @@ StorBucketDatabase& ServiceLayerComponent::getBucketDatabase(BucketSpace bucketSpace) const { assert(bucketSpace == BucketSpace::placeHolder()); - assert(_bucketDatabase != 0); - return *_bucketDatabase; + assert(_bucketSpaceRepo != nullptr); + return _bucketSpaceRepo->get(bucketSpace).bucketDatabase(); } uint16_t diff --git a/storage/src/vespa/storage/common/servicelayercomponent.h b/storage/src/vespa/storage/common/servicelayercomponent.h index 3e6ccaaa5a0..bd46e6ba4f9 100644 --- a/storage/src/vespa/storage/common/servicelayercomponent.h +++ b/storage/src/vespa/storage/common/servicelayercomponent.h @@ -30,6 +30,7 @@ namespace storage { +class ContentBucketSpaceRepo; class MinimumUsedBitsTracker; class StorBucketDatabase; @@ -38,7 +39,7 @@ struct ServiceLayerManagedComponent virtual ~ServiceLayerManagedComponent() {} virtual void setDiskCount(uint16_t count) = 0; - virtual void setBucketDatabase(StorBucketDatabase&) = 0; + virtual void setBucketSpaceRepo(ContentBucketSpaceRepo&) = 0; virtual void setMinUsedBitsTracker(MinimumUsedBitsTracker&) = 0; }; @@ -52,12 +53,12 @@ class ServiceLayerComponent : public StorageComponent, private ServiceLayerManagedComponent { uint16_t _diskCount; - StorBucketDatabase* _bucketDatabase; + ContentBucketSpaceRepo* _bucketSpaceRepo; MinimumUsedBitsTracker* _minUsedBitsTracker; // ServiceLayerManagedComponent implementation void setDiskCount(uint16_t count) override { _diskCount = count; } - void setBucketDatabase(StorBucketDatabase& db) override { _bucketDatabase = &db; } + void setBucketSpaceRepo(ContentBucketSpaceRepo& repo) override { _bucketSpaceRepo = &repo; } void setMinUsedBitsTracker(MinimumUsedBitsTracker& tracker) override { _minUsedBitsTracker = &tracker; } @@ -68,8 +69,8 @@ public: vespalib::stringref name) : StorageComponent(compReg, name), _diskCount(0), - _bucketDatabase(0), - _minUsedBitsTracker(0) + _bucketSpaceRepo(nullptr), + _minUsedBitsTracker(nullptr) { compReg.registerServiceLayerComponent(*this); } diff --git a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp index a2699edd258..da734c07c2d 100644 --- a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp +++ b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.cpp @@ -9,7 +9,7 @@ using vespalib::IllegalStateException; ServiceLayerComponentRegisterImpl::ServiceLayerComponentRegisterImpl() : _diskCount(0), - _bucketDatabase() + _bucketSpaceRepo() { } void @@ -19,7 +19,7 @@ ServiceLayerComponentRegisterImpl::registerServiceLayerComponent( vespalib::LockGuard lock(_componentLock); _components.push_back(&smc); smc.setDiskCount(_diskCount); - smc.setBucketDatabase(_bucketDatabase); + smc.setBucketSpaceRepo(_bucketSpaceRepo); smc.setMinUsedBitsTracker(_minUsedBitsTracker); } diff --git a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h index b46d795cfcc..5b3e54e3831 100644 --- a/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h +++ b/storage/src/vespa/storage/frameworkimpl/component/servicelayercomponentregisterimpl.h @@ -9,7 +9,7 @@ #include "storagecomponentregisterimpl.h" #include <vespa/storage/bucketdb/minimumusedbitstracker.h> -#include <vespa/storage/bucketdb/storbucketdb.h> +#include <vespa/storage/common/content_bucket_space_repo.h> #include <vespa/storage/common/servicelayercomponent.h> namespace storage { @@ -21,7 +21,7 @@ class ServiceLayerComponentRegisterImpl vespalib::Lock _componentLock; std::vector<ServiceLayerManagedComponent*> _components; uint16_t _diskCount; - StorBucketDatabase _bucketDatabase; + ContentBucketSpaceRepo _bucketSpaceRepo; MinimumUsedBitsTracker _minUsedBitsTracker; public: @@ -30,7 +30,7 @@ public: ServiceLayerComponentRegisterImpl(); uint16_t getDiskCount() const { return _diskCount; } - StorBucketDatabase& getBucketDatabase() { return _bucketDatabase; } + ContentBucketSpaceRepo& getBucketSpaceRepo() { return _bucketSpaceRepo; } MinimumUsedBitsTracker& getMinUsedBitsTracker() { return _minUsedBitsTracker; } |