aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-08-18 12:24:57 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-08-18 12:25:41 +0000
commit5666e30337848535eb706b3ea24f1dddec172e5c (patch)
tree7ccb2c2060636c294c160f5b5430ff6205fadc42
parenteb6fc9d3ae00028caff6543a0dc93fb40eef01a5 (diff)
Use a single level hash_map with a compund key.
-rw-r--r--storage/src/vespa/storage/distributor/distributor_stripe.cpp8
-rw-r--r--storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.cpp30
-rw-r--r--storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.h19
3 files changed, 25 insertions, 32 deletions
diff --git a/storage/src/vespa/storage/distributor/distributor_stripe.cpp b/storage/src/vespa/storage/distributor/distributor_stripe.cpp
index b686c6bc80c..243b3c5ecb2 100644
--- a/storage/src/vespa/storage/distributor/distributor_stripe.cpp
+++ b/storage/src/vespa/storage/distributor/distributor_stripe.cpp
@@ -604,11 +604,9 @@ PerNodeBucketSpacesStats
toBucketSpacesStats(const NodeMaintenanceStatsTracker &maintenanceStats)
{
PerNodeBucketSpacesStats result;
- for (const auto &nodeEntry : maintenanceStats.perNodeStats()) {
- for (const auto &bucketSpaceEntry : nodeEntry.second) {
- auto bucketSpace = document::FixedBucketSpaces::to_string(bucketSpaceEntry.first);
- result[nodeEntry.first][bucketSpace] = toBucketSpaceStats(bucketSpaceEntry.second);
- }
+ for (const auto &entry : maintenanceStats.perNodeStats()) {
+ auto bucketSpace = document::FixedBucketSpaces::to_string(entry.first.bucketSpace());
+ result[entry.first.node()][bucketSpace] = toBucketSpaceStats(entry.second);
}
return result;
}
diff --git a/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.cpp b/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.cpp
index 62ba3742627..b10f5abd0f1 100644
--- a/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.cpp
+++ b/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.cpp
@@ -9,35 +9,15 @@ namespace storage::distributor {
const NodeMaintenanceStats NodeMaintenanceStatsTracker::_emptyNodeMaintenanceStats;
-namespace {
-
-void
-merge_bucket_spaces_stats(NodeMaintenanceStatsTracker::BucketSpacesStats& dest,
- const NodeMaintenanceStatsTracker::BucketSpacesStats& src)
-{
- for (const auto& entry : src) {
- auto bucket_space = entry.first;
- dest[bucket_space].merge(entry.second);
- }
-}
-
-}
-
NodeMaintenanceStats &
NodeMaintenanceStatsTracker::stats(uint16_t node, document::BucketSpace bucketSpace) {
- return _node_stats[node][bucketSpace];
+ return _node_stats[BucketSpaceAndNode(node, bucketSpace)];
}
const NodeMaintenanceStats &
NodeMaintenanceStatsTracker::stats(uint16_t node, document::BucketSpace bucketSpace) const noexcept {
- auto nodeItr = _node_stats.find(node);
- if (nodeItr != _node_stats.end()) {
- auto bucketSpaceItr = nodeItr->second.find(bucketSpace);
- if (bucketSpaceItr != nodeItr->second.end()) {
- return bucketSpaceItr->second;
- }
- }
- return _emptyNodeMaintenanceStats;
+ auto nodeItr = _node_stats.find(BucketSpaceAndNode(node, bucketSpace));
+ return (nodeItr != _node_stats.end()) ? nodeItr->second : _emptyNodeMaintenanceStats;
}
const NodeMaintenanceStats&
@@ -55,8 +35,8 @@ void
NodeMaintenanceStatsTracker::merge(const NodeMaintenanceStatsTracker& rhs)
{
for (const auto& entry : rhs._node_stats) {
- auto node_index = entry.first;
- merge_bucket_spaces_stats(_node_stats[node_index], entry.second);
+ auto key = entry.first;
+ _node_stats[key].merge(entry.second);
}
_max_observed_time_since_last_gc = std::max(_max_observed_time_since_last_gc,
rhs._max_observed_time_since_last_gc);
diff --git a/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.h b/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.h
index 1d3423b2716..a5cb12de9a4 100644
--- a/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.h
+++ b/storage/src/vespa/storage/distributor/maintenance/node_maintenance_stats_tracker.h
@@ -51,8 +51,23 @@ std::ostream& operator<<(std::ostream&, const NodeMaintenanceStats&);
class NodeMaintenanceStatsTracker
{
public:
- using BucketSpacesStats = vespalib::hash_map<document::BucketSpace, NodeMaintenanceStats, document::BucketSpace::hash>;
- using PerNodeStats = vespalib::hash_map<uint16_t, BucketSpacesStats>;
+ class BucketSpaceAndNode {
+ public:
+ BucketSpaceAndNode(uint16_t node_in, document::BucketSpace bucketSpace_in) noexcept
+ : _bucketSpace(bucketSpace_in),
+ _node(node_in)
+ {}
+ uint32_t hash() const noexcept { return (uint32_t(_node) << 2) | (_bucketSpace.getId() & 0x3); }
+ bool operator == (const BucketSpaceAndNode & b) const noexcept {
+ return (_bucketSpace == b._bucketSpace) && (_node == b._node);
+ }
+ document::BucketSpace bucketSpace() const noexcept { return _bucketSpace; }
+ uint16_t node() const noexcept { return _node; }
+ private:
+ document::BucketSpace _bucketSpace;
+ uint16_t _node;
+ };
+ using PerNodeStats = vespalib::hash_map<BucketSpaceAndNode, NodeMaintenanceStats>;
private:
PerNodeStats _node_stats;