summaryrefslogtreecommitdiffstats
path: root/vdslib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-06-26 14:29:14 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-06-26 14:29:14 +0000
commit893c46125438520819e88e7a363dfb823750b086 (patch)
tree80760da77a1f04e5ec488ee8de7b363e625ec5ae /vdslib
parentd4d3e55248acbf07a9b9dd48453e085a1d4a41df (diff)
Precompute node 2 group mapping config time.
Diffstat (limited to 'vdslib')
-rw-r--r--vdslib/src/vespa/vdslib/distribution/distribution.cpp36
-rw-r--r--vdslib/src/vespa/vdslib/distribution/distribution.h5
-rw-r--r--vdslib/src/vespa/vdslib/distribution/group.cpp2
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);
}