summaryrefslogtreecommitdiffstats
path: root/vdslib
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@oath.com>2018-03-02 10:00:59 +0000
committerTor Brede Vekterli <vekterli@oath.com>2018-03-05 14:02:54 +0000
commit98c31996d220c631b3d3d31fd37cb951f3c6f49a (patch)
tree0ad80bcaf43f517e43926256ec0be0aedec32465 /vdslib
parent1081ee11b211b66a54a5983f7e5057e14190815d (diff)
Add handling of v3 setDistributionStates RPC from cluster controller
ClusterStateBundle is populated with derived states, but these are not yet exposed via the bucket space getter function.
Diffstat (limited to 'vdslib')
-rw-r--r--vdslib/src/vespa/vdslib/state/cluster_state_bundle.cpp41
-rw-r--r--vdslib/src/vespa/vdslib/state/cluster_state_bundle.h16
2 files changed, 56 insertions, 1 deletions
diff --git a/vdslib/src/vespa/vdslib/state/cluster_state_bundle.cpp b/vdslib/src/vespa/vdslib/state/cluster_state_bundle.cpp
index a2bbba5e52c..cf9c0ba6dff 100644
--- a/vdslib/src/vespa/vdslib/state/cluster_state_bundle.cpp
+++ b/vdslib/src/vespa/vdslib/state/cluster_state_bundle.cpp
@@ -1,7 +1,9 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/document/bucket/fixed_bucket_spaces.h>
#include "cluster_state_bundle.h"
#include "clusterstate.h"
+#include <iostream>
namespace storage::lib {
@@ -10,6 +12,13 @@ ClusterStateBundle::ClusterStateBundle(const ClusterState &baselineClusterState)
{
}
+ClusterStateBundle::ClusterStateBundle(const ClusterState& baselineClusterState,
+ BucketSpaceStateMapping derivedBucketSpaceStates)
+ : _baselineClusterState(std::make_shared<const ClusterState>(baselineClusterState)),
+ _derivedBucketSpaceStates(std::move(derivedBucketSpaceStates))
+{
+}
+
ClusterStateBundle::~ClusterStateBundle() = default;
const std::shared_ptr<const lib::ClusterState> &
@@ -22,6 +31,7 @@ const std::shared_ptr<const lib::ClusterState> &
ClusterStateBundle::getDerivedClusterState(document::BucketSpace) const
{
// For now, just return the baseline cluster state.
+ // TODO use _derivedBucketSpaceStates
return _baselineClusterState;
}
@@ -34,7 +44,36 @@ ClusterStateBundle::getVersion() const
bool
ClusterStateBundle::operator==(const ClusterStateBundle &rhs) const
{
- return *_baselineClusterState == *rhs._baselineClusterState;
+ if (!(*_baselineClusterState == *rhs._baselineClusterState)) {
+ return false;
+ }
+ if (_derivedBucketSpaceStates.size() != rhs._derivedBucketSpaceStates.size()) {
+ return false;
+ }
+ // Can't do a regular operator== comparison since we must check equality
+ // of cluster state _values_, not their _pointers_.
+ for (auto& lhs_ds : _derivedBucketSpaceStates) {
+ auto rhs_iter = rhs._derivedBucketSpaceStates.find(lhs_ds.first);
+ if ((rhs_iter == rhs._derivedBucketSpaceStates.end())
+ || !(*lhs_ds.second == *rhs_iter->second)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+std::ostream& operator<<(std::ostream& os, const ClusterStateBundle& bundle) {
+ os << "ClusterStateBundle('" << *bundle.getBaselineClusterState();
+ if (!bundle.getDerivedClusterStates().empty()) {
+ // Output ordering is undefined for of per-space states.
+ for (auto& ds : bundle.getDerivedClusterStates()) {
+ os << "', ";
+ os << document::FixedBucketSpaces::to_string(ds.first);
+ os << " '" << *ds.second;
+ }
+ }
+ os << "')";
+ return os;
}
}
diff --git a/vdslib/src/vespa/vdslib/state/cluster_state_bundle.h b/vdslib/src/vespa/vdslib/state/cluster_state_bundle.h
index 77d26092f4e..a8ee0b54713 100644
--- a/vdslib/src/vespa/vdslib/state/cluster_state_bundle.h
+++ b/vdslib/src/vespa/vdslib/state/cluster_state_bundle.h
@@ -3,6 +3,8 @@
#pragma once
#include <vespa/document/bucket/bucketspace.h>
+#include <unordered_map>
+#include <iosfwd>
namespace storage::lib {
@@ -14,14 +16,28 @@ class ClusterState;
*/
class ClusterStateBundle
{
+public:
+ using BucketSpaceStateMapping = std::unordered_map<
+ document::BucketSpace,
+ std::shared_ptr<const ClusterState>,
+ document::BucketSpace::hash
+ >;
std::shared_ptr<const ClusterState> _baselineClusterState;
+ BucketSpaceStateMapping _derivedBucketSpaceStates;
public:
explicit ClusterStateBundle(const ClusterState &baselineClusterState);
+ ClusterStateBundle(const ClusterState& baselineClusterState,
+ BucketSpaceStateMapping derivedBucketSpaceStates);
~ClusterStateBundle();
const std::shared_ptr<const ClusterState> &getBaselineClusterState() const;
const std::shared_ptr<const ClusterState> &getDerivedClusterState(document::BucketSpace bucketSpace) const;
+ const BucketSpaceStateMapping& getDerivedClusterStates() const noexcept {
+ return _derivedBucketSpaceStates;
+ }
uint32_t getVersion() const;
bool operator==(const ClusterStateBundle &rhs) const;
};
+std::ostream& operator<<(std::ostream&, const ClusterStateBundle&);
+
}