diff options
author | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-07-06 14:50:53 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-07-07 12:33:48 +0000 |
commit | f4cc2ad36df67fd6f3242f32e19eaea833bf6abc (patch) | |
tree | df240e5dc4b924f50282d4de9e5b46b9ced7cbb9 /storage | |
parent | b87926e071aa8603a5856b1d94caf77f571875c2 (diff) |
Use bucket DB read guards for metric and status aggregation
Diffstat (limited to 'storage')
4 files changed, 34 insertions, 17 deletions
diff --git a/storage/src/tests/bucketdb/lockablemaptest.cpp b/storage/src/tests/bucketdb/lockablemaptest.cpp index c0d29aad158..709e158e531 100644 --- a/storage/src/tests/bucketdb/lockablemaptest.cpp +++ b/storage/src/tests/bucketdb/lockablemaptest.cpp @@ -356,6 +356,22 @@ TYPED_TEST(LockableMapTest, can_abort_during_chunked_iteration) { EXPECT_EQ(expected, proc.toString()); } +TYPED_TEST(LockableMapTest, can_iterate_via_read_guard) { + TypeParam map; + bool pre_existed; + map.insert(16, A(1, 2, 3), "foo", pre_existed); + map.insert(11, A(4, 6, 0), "foo", pre_existed); + map.insert(14, A(42, 0, 0), "foo", pre_existed); + std::string expected("11 - A(4, 6, 0)\n" + "14 - A(42, 0, 0)\n" + "16 - A(1, 2, 3)\n"); + + ConstProcessor<TypeParam> cproc; + auto guard = map.acquire_read_guard(); + guard->for_each(std::ref(cproc)); + EXPECT_EQ(expected, cproc.toString()); +} + TYPED_TEST(LockableMapTest, find_buckets_simple) { TypeParam map; diff --git a/storage/src/vespa/storage/bucketdb/bucketmanager.cpp b/storage/src/vespa/storage/bucketdb/bucketmanager.cpp index fcb019fb6bc..530c1236436 100644 --- a/storage/src/vespa/storage/bucketdb/bucketmanager.cpp +++ b/storage/src/vespa/storage/bucketdb/bucketmanager.cpp @@ -174,12 +174,11 @@ namespace { std::vector<Count> disk; uint32_t lowestUsedBit; - MetricsUpdater(uint16_t diskCnt) + explicit MetricsUpdater(uint16_t diskCnt) : diskCount(diskCnt), disk(diskCnt), lowestUsedBit(58) {} - StorBucketDatabase::Decision operator()( - document::BucketId::Type bucketId, - const StorBucketDatabase::Entry& data) + void operator()(document::BucketId::Type bucketId, + const StorBucketDatabase::Entry& data) { document::BucketId bucket( document::BucketId::keyToBucketId(bucketId)); @@ -200,8 +199,6 @@ namespace { lowestUsedBit = bucket.getUsedBits(); } } - - return StorBucketDatabase::Decision::CONTINUE; }; void add(const MetricsUpdater& rhs) { @@ -241,7 +238,8 @@ BucketManager::updateMetrics(bool updateDocCount) MetricsUpdater total(diskCount); for (auto& space : _component.getBucketSpaceRepo()) { MetricsUpdater m(diskCount); - space.second->bucketDatabase().for_each_chunked(std::ref(m), "BucketManager::updateMetrics"); + auto guard = space.second->bucketDatabase().acquire_read_guard(); + guard->for_each(std::ref(m)); total.add(m); if (updateDocCount) { auto bm = _metrics->bucket_spaces.find(space.first); @@ -270,8 +268,7 @@ BucketManager::updateMetrics(bool updateDocCount) void BucketManager::updateMinUsedBits() { MetricsUpdater m(_component.getDiskCount()); - _component.getBucketSpaceRepo().forEachBucketChunked( - m, "BucketManager::updateMetrics"); + _component.getBucketSpaceRepo().for_each_bucket(std::ref(m)); // When going through to get sizes, we also record min bits MinimumUsedBitsTracker& bitTracker(_component.getMinUsedBitsTracker()); if (bitTracker.getMinUsedBits() != m.lowestUsedBit) { @@ -339,9 +336,7 @@ namespace { public: explicit BucketDBDumper(vespalib::XmlOutputStream& xos) : _xos(xos) {} - StorBucketDatabase::Decision operator()( - uint64_t bucketId, const StorBucketDatabase::Entry& info) - { + void operator()(uint64_t bucketId, const StorBucketDatabase::Entry& info) { using namespace vespalib::xml; document::BucketId bucket( document::BucketId::keyToBucketId(bucketId)); @@ -355,7 +350,6 @@ namespace { info.getBucketInfo().printXml(_xos); _xos << XmlAttribute("disk", info.disk); _xos << XmlEndTag(); - return StorBucketDatabase::Decision::CONTINUE; }; }; } @@ -377,8 +371,8 @@ BucketManager::reportStatus(std::ostream& out, xmlReporter << XmlTag("bucket-space") << XmlAttribute("name", document::FixedBucketSpaces::to_string(space.first)); BucketDBDumper dumper(xmlReporter.getStream()); - _component.getBucketSpaceRepo().get(space.first).bucketDatabase().for_each_chunked( - std::ref(dumper), "BucketManager::reportStatus"); + auto guard = _component.getBucketSpaceRepo().get(space.first).bucketDatabase().acquire_read_guard(); + guard->for_each(std::ref(dumper)); xmlReporter << XmlEndTag(); } xmlReporter << XmlEndTag(); @@ -398,7 +392,7 @@ BucketManager::dump(std::ostream& out) const { vespalib::XmlOutputStream xos(out); BucketDBDumper dumper(xos); - _component.getBucketSpaceRepo().forEachBucketChunked(dumper, "BucketManager::dump"); + _component.getBucketSpaceRepo().for_each_bucket(std::ref(dumper)); } diff --git a/storage/src/vespa/storage/bucketdb/storbucketdb.cpp b/storage/src/vespa/storage/bucketdb/storbucketdb.cpp index 6940c072ed6..849164ace7d 100644 --- a/storage/src/vespa/storage/bucketdb/storbucketdb.cpp +++ b/storage/src/vespa/storage/bucketdb/storbucketdb.cpp @@ -138,7 +138,7 @@ void StorBucketDatabase::for_each( std::unique_ptr<bucketdb::ReadGuard<StorBucketDatabase::Entry>> StorBucketDatabase::acquire_read_guard() const { - return {}; + return _impl->acquire_read_guard(); } template class JudyMultiMap<bucketdb::StorageBucketInfo>; 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 142bb5ea1d5..6d8bd67b071 100644 --- a/storage/src/vespa/storage/common/content_bucket_space_repo.h +++ b/storage/src/vespa/storage/common/content_bucket_space_repo.h @@ -43,6 +43,13 @@ public: } } + template <typename Functor> + void for_each_bucket(Functor functor) const { + for (const auto& elem : _map) { + elem.second->bucketDatabase().acquire_read_guard()->for_each(std::move(functor)); + } + } + }; } |