diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-06-26 14:29:14 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-06-26 14:29:14 +0000 |
commit | 893c46125438520819e88e7a363dfb823750b086 (patch) | |
tree | 80760da77a1f04e5ec488ee8de7b363e625ec5ae /vdslib | |
parent | d4d3e55248acbf07a9b9dd48453e085a1d4a41df (diff) |
Precompute node 2 group mapping config time.
Diffstat (limited to 'vdslib')
-rw-r--r-- | vdslib/src/vespa/vdslib/distribution/distribution.cpp | 36 | ||||
-rw-r--r-- | vdslib/src/vespa/vdslib/distribution/distribution.h | 5 | ||||
-rw-r--r-- | vdslib/src/vespa/vdslib/distribution/group.cpp | 2 |
3 files changed, 25 insertions, 18 deletions
diff --git a/vdslib/src/vespa/vdslib/distribution/distribution.cpp b/vdslib/src/vespa/vdslib/distribution/distribution.cpp index 46b85b87c5d..0abb99e17d2 100644 --- a/vdslib/src/vespa/vdslib/distribution/distribution.cpp +++ b/vdslib/src/vespa/vdslib/distribution/distribution.cpp @@ -39,6 +39,7 @@ VESPA_IMPLEMENT_EXCEPTION(TooFewBucketBitsInUseException, vespalib::Exception); Distribution::Distribution() : _distributionBitMasks(getDistributionBitMasks()), _nodeGraph(), + _node2Group(), _redundancy(), _initialRedundancy(0), _ensurePrimaryPersisted(true), @@ -55,6 +56,7 @@ Distribution::Distribution() Distribution::Distribution(const Distribution& d) : _distributionBitMasks(getDistributionBitMasks()), _nodeGraph(), + _node2Group(), _redundancy(), _initialRedundancy(0), _ensurePrimaryPersisted(true), @@ -69,7 +71,7 @@ Distribution::Distribution(const Distribution& d) Distribution::ConfigWrapper::ConfigWrapper(std::unique_ptr<DistributionConfig> cfg) : _cfg(std::move(cfg)) { } -Distribution::ConfigWrapper::~ConfigWrapper() { } +Distribution::ConfigWrapper::~ConfigWrapper() = default; Distribution::Distribution(const ConfigWrapper & config) : Distribution(config.get()) @@ -78,6 +80,7 @@ Distribution::Distribution(const ConfigWrapper & config) : Distribution::Distribution(const vespa::config::content::StorDistributionConfig & config) : _distributionBitMasks(getDistributionBitMasks()), _nodeGraph(), + _node2Group(), _redundancy(), _initialRedundancy(0), _ensurePrimaryPersisted(true), @@ -93,6 +96,7 @@ Distribution::Distribution(const vespa::config::content::StorDistributionConfig Distribution::Distribution(const vespalib::string& serialized) : _distributionBitMasks(getDistributionBitMasks()), _nodeGraph(), + _node2Group(), _redundancy(), _initialRedundancy(0), _ensurePrimaryPersisted(true), @@ -113,7 +117,7 @@ Distribution::operator=(const Distribution& d) return *this; } -Distribution::~Distribution() { } +Distribution::~Distribution() = default; namespace { using ConfigDiskDistribution = vespa::config::content::StorDistributionConfig::DiskDistribution; @@ -142,34 +146,35 @@ Distribution::configure(const vespa::config::content::StorDistributionConfig& co { typedef vespa::config::content::StorDistributionConfig::Group ConfigGroup; std::unique_ptr<Group> nodeGraph; + std::vector<const Group *> node2Group; for (uint32_t i=0, n=config.group.size(); i<n; ++i) { const ConfigGroup& cg(config.group[i]); std::vector<uint16_t> path; - if (nodeGraph.get() != nullptr) { + if (nodeGraph) { path = DistributionConfigUtil::getGroupPath(cg.index); } bool isLeafGroup = (cg.nodes.size() > 0); - std::unique_ptr<Group> group; uint16_t index = (path.empty() ? 0 : path.back()); - if (isLeafGroup) { - group.reset(new Group(index, cg.name)); - } else { - group.reset(new Group( - index, cg.name, - Group::Distribution(cg.partitions), config.redundancy)); - } + std::unique_ptr<Group> group = (isLeafGroup) + ? std::make_unique<Group>(index, cg.name) + : std::make_unique<Group>(index, cg.name, Group::Distribution(cg.partitions), config.redundancy); group->setCapacity(cg.capacity); if (isLeafGroup) { std::vector<uint16_t> nodes(cg.nodes.size()); for (uint32_t j=0, m=nodes.size(); j<m; ++j) { - nodes[j] = cg.nodes[j].index; + uint16_t nodeIndex = cg.nodes[j].index; + nodes[j] = nodeIndex; + if (node2Group.size() <= nodeIndex) { + node2Group.resize(nodeIndex + 1); + } + node2Group[nodeIndex] = group.get(); } group->setNodes(nodes); } if (path.empty()) { nodeGraph = std::move(group); } else { - assert(nodeGraph.get() != nullptr); + assert(nodeGraph); Group* parent = nodeGraph.get(); for (uint32_t j=0; j<path.size() - 1; ++j) { parent = parent->getSubGroups()[path[j]]; @@ -177,7 +182,7 @@ Distribution::configure(const vespa::config::content::StorDistributionConfig& co parent->addSubGroup(std::move(group)); } } - if (nodeGraph.get() == nullptr) { + if ( ! nodeGraph) { throw vespalib::IllegalStateException( "Got config that didn't seem to specify even a root group. Must " "have a root group at minimum:\n" @@ -185,6 +190,7 @@ Distribution::configure(const vespa::config::content::StorDistributionConfig& co } nodeGraph->calculateDistributionHashValues(); _nodeGraph = std::move(nodeGraph); + _node2Group = std::move(node2Group); _redundancy = config.redundancy; _initialRedundancy = config.initialRedundancy; _ensurePrimaryPersisted = config.ensurePrimaryPersisted; @@ -670,7 +676,7 @@ Distribution::splitNodesIntoLeafGroups(IndexList nodeList) const std::vector<IndexList> result; std::map<uint16_t, IndexList> nodes; for (auto node : nodeList) { - const Group* group(_nodeGraph->getGroupForNode(node)); + const Group* group(_node2Group[node]); if (group == nullptr) { LOGBP(warning, "Node %u is not assigned to a group. " "Should not happen?", node); diff --git a/vdslib/src/vespa/vdslib/distribution/distribution.h b/vdslib/src/vespa/vdslib/distribution/distribution.h index 6da60e084bb..9ee505be7cd 100644 --- a/vdslib/src/vespa/vdslib/distribution/distribution.h +++ b/vdslib/src/vespa/vdslib/distribution/distribution.h @@ -33,8 +33,9 @@ public: enum DiskDistribution { MODULO, MODULO_INDEX, MODULO_KNUTH, MODULO_BID }; private: - std::vector<uint32_t> _distributionBitMasks; - std::unique_ptr<Group> _nodeGraph; + std::vector<uint32_t> _distributionBitMasks; + std::unique_ptr<Group> _nodeGraph; + std::vector<const Group *> _node2Group; uint16_t _redundancy; uint16_t _initialRedundancy; uint16_t _readyCopies; diff --git a/vdslib/src/vespa/vdslib/distribution/group.cpp b/vdslib/src/vespa/vdslib/distribution/group.cpp index abfea22416d..45f8f0f8aea 100644 --- a/vdslib/src/vespa/vdslib/distribution/group.cpp +++ b/vdslib/src/vespa/vdslib/distribution/group.cpp @@ -103,7 +103,7 @@ Group::addSubGroup(Group::UP group) "Cannot add sub groups to a group without a valid distribution", VESPA_STRLOC); } - if (!group.get()) { + if (!group) { throw vespalib::IllegalArgumentException( "Cannot add null group.", VESPA_STRLOC); } |