diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-08-18 12:24:57 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-08-18 12:25:41 +0000 |
commit | 5666e30337848535eb706b3ea24f1dddec172e5c (patch) | |
tree | 7ccb2c2060636c294c160f5b5430ff6205fadc42 | |
parent | eb6fc9d3ae00028caff6543a0dc93fb40eef01a5 (diff) |
Use a single level hash_map with a compund key.
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; |