summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2018-08-07 13:25:29 +0000
committerTor Egge <Tor.Egge@oath.com>2018-08-07 13:25:29 +0000
commit071e555f355d090dc208b8ed185621d6cabe2daa (patch)
tree5e83ebc8257774b5f2895157ef7830fb2c683050
parentd0cf8f54872dd5483e1d319c9fdde3987bdcf9b1 (diff)
Deactivate all buckets in content layer bucket db when derived cluster
state indicates that node changes from up to down state even if node remains up according to baseline cluster state.
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space.cpp17
-rw-r--r--storage/src/vespa/storage/common/content_bucket_space.h3
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp21
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestormanager.h1
4 files changed, 30 insertions, 12 deletions
diff --git a/storage/src/vespa/storage/common/content_bucket_space.cpp b/storage/src/vespa/storage/common/content_bucket_space.cpp
index 2bae118e364..0827c721100 100644
--- a/storage/src/vespa/storage/common/content_bucket_space.cpp
+++ b/storage/src/vespa/storage/common/content_bucket_space.cpp
@@ -9,7 +9,8 @@ ContentBucketSpace::ContentBucketSpace(document::BucketSpace bucketSpace)
_bucketDatabase(),
_lock(),
_clusterState(),
- _distribution()
+ _distribution(),
+ _nodeUpInLastNodeStateSeenByProvider(false)
{
}
@@ -41,4 +42,18 @@ ContentBucketSpace::getDistribution() const
return _distribution;
}
+bool
+ContentBucketSpace::getNodeUpInLastNodeStateSeenByProvider() const
+{
+ std::lock_guard guard(_lock);
+ return _nodeUpInLastNodeStateSeenByProvider;
+}
+
+void
+ContentBucketSpace::setNodeUpInLastNodeStateSeenByProvider(bool nodeUpInLastNodeStateSeenByProvider)
+{
+ std::lock_guard guard(_lock);
+ _nodeUpInLastNodeStateSeenByProvider = nodeUpInLastNodeStateSeenByProvider;
+}
+
}
diff --git a/storage/src/vespa/storage/common/content_bucket_space.h b/storage/src/vespa/storage/common/content_bucket_space.h
index 6ccc82bc4fb..81ce6234879 100644
--- a/storage/src/vespa/storage/common/content_bucket_space.h
+++ b/storage/src/vespa/storage/common/content_bucket_space.h
@@ -22,6 +22,7 @@ private:
mutable std::mutex _lock;
std::shared_ptr<const lib::ClusterState> _clusterState;
std::shared_ptr<const lib::Distribution> _distribution;
+ bool _nodeUpInLastNodeStateSeenByProvider;
public:
using UP = std::unique_ptr<ContentBucketSpace>;
@@ -33,6 +34,8 @@ public:
std::shared_ptr<const lib::ClusterState> getClusterState() const;
void setDistribution(std::shared_ptr<const lib::Distribution> distribution);
std::shared_ptr<const lib::Distribution> getDistribution() const;
+ bool getNodeUpInLastNodeStateSeenByProvider() const;
+ void setNodeUpInLastNodeStateSeenByProvider(bool nodeUpInLastNodeStateSeenByProvider);
};
}
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
index 961af1532a1..d1f0a24178a 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
+++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
@@ -36,7 +36,6 @@ FileStorManager(const config::ConfigUri & configUri, const spi::PartitionStateLi
_partitions(partitions),
_providerCore(provider),
_providerErrorWrapper(_providerCore),
- _nodeUpInLastNodeStateSeenByProvider(false),
_providerMetric(new spi::MetricPersistenceProvider(_providerErrorWrapper)),
_provider(_providerMetric.get()),
_bucketIdFactory(_component.getBucketIdFactory()),
@@ -886,21 +885,23 @@ FileStorManager::updateState()
auto clusterStateBundle = _component.getStateUpdater().getClusterStateBundle();
lib::ClusterState::CSP state(clusterStateBundle->getBaselineClusterState());
lib::Node node(_component.getNodeType(), _component.getIndex());
- bool nodeUp = state->getNodeState(node).getState().oneOf("uir");
LOG(debug, "FileStorManager received cluster state '%s'", state->toString().c_str());
- // If edge where we go down
- if (_nodeUpInLastNodeStateSeenByProvider && !nodeUp) {
- LOG(debug, "Received cluster state where this node is down; de-activating all buckets in database");
- Deactivator deactivator;
- _component.getBucketSpaceRepo().forEachBucket(deactivator, "FileStorManager::updateState");
- }
for (const auto &elem : _component.getBucketSpaceRepo()) {
BucketSpace bucketSpace(elem.first);
- spi::ClusterState spiState(*elem.second->getClusterState(), _component.getIndex(), *elem.second->getDistribution());
+ ContentBucketSpace &contentBucketSpace = *elem.second;
+ auto derivedClusterState = contentBucketSpace.getClusterState();
+ bool nodeUp = derivedClusterState->getNodeState(node).getState().oneOf("uir");
+ // If edge where we go down
+ if (contentBucketSpace.getNodeUpInLastNodeStateSeenByProvider() && !nodeUp) {
+ LOG(debug, "Received cluster state where this node is down; de-activating all buckets in database for bucket space %s", bucketSpace.toString().c_str());
+ Deactivator deactivator;
+ contentBucketSpace.bucketDatabase().all(deactivator, "FileStorManager::updateState");
+ }
+ contentBucketSpace.setNodeUpInLastNodeStateSeenByProvider(nodeUp);
+ spi::ClusterState spiState(*derivedClusterState, _component.getIndex(), *contentBucketSpace.getDistribution());
_provider->setClusterState(bucketSpace, spiState);
}
- _nodeUpInLastNodeStateSeenByProvider = nodeUp;
}
void
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.h b/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
index 0bd2ffa5910..4bf2c1049cf 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
+++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
@@ -56,7 +56,6 @@ class FileStorManager : public StorageLinkQueued,
const spi::PartitionStateList& _partitions;
spi::PersistenceProvider& _providerCore;
ProviderErrorWrapper _providerErrorWrapper;
- bool _nodeUpInLastNodeStateSeenByProvider;
spi::MetricPersistenceProvider::UP _providerMetric;
spi::PersistenceProvider* _provider;