aboutsummaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@verizonmedia.com>2020-07-06 14:50:53 +0000
committerTor Brede Vekterli <vekterli@verizonmedia.com>2020-07-07 12:33:48 +0000
commitf4cc2ad36df67fd6f3242f32e19eaea833bf6abc (patch)
treedf240e5dc4b924f50282d4de9e5b46b9ced7cbb9 /storage
parentb87926e071aa8603a5856b1d94caf77f571875c2 (diff)
Use bucket DB read guards for metric and status aggregation
Diffstat (limited to 'storage')
-rw-r--r--storage/src/tests/bucketdb/lockablemaptest.cpp16
-rw-r--r--storage/src/vespa/storage/bucketdb/bucketmanager.cpp26
-rw-r--r--storage/src/vespa/storage/bucketdb/storbucketdb.cpp2
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space_repo.h7
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));
+ }
+ }
+
};
}