summaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-05-13 14:57:47 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-05-13 14:57:47 +0000
commitf33f5ec3ce70fb0f05110f88d3763138cbc1cd9f (patch)
tree62b6e9b558c7024d9eaef66f2869afbf22d089c5 /storage
parent897e890350db20c03b50f90bde875745c373b6f4 (diff)
Ensure that we hold the lock when calling mark_controller_as_having_observed_explicit_node_state.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/vespa/storage/storageserver/statemanager.cpp11
-rw-r--r--storage/src/vespa/storage/storageserver/statemanager.h2
2 files changed, 6 insertions, 7 deletions
diff --git a/storage/src/vespa/storage/storageserver/statemanager.cpp b/storage/src/vespa/storage/storageserver/statemanager.cpp
index 069ba1b8b92..da221e312e2 100644
--- a/storage/src/vespa/storage/storageserver/statemanager.cpp
+++ b/storage/src/vespa/storage/storageserver/statemanager.cpp
@@ -480,10 +480,9 @@ StateManager::onGetNodeState(const api::GetNodeStateCommand::SP& cmd)
: cmd->getExpectedState()->toString().c_str(),
_nodeState->toString().c_str());
reply = std::make_shared<api::GetNodeStateReply>(*cmd, *_nodeState);
+ mark_controller_as_having_observed_explicit_node_state(lock, cmd->getSourceIndex());
lock.unlock();
- std::string nodeInfo(getNodeInfo());
- reply->setNodeInfo(nodeInfo);
- mark_controller_as_having_observed_explicit_node_state(cmd->getSourceIndex());
+ reply->setNodeInfo(getNodeInfo());
}
}
if (reply) {
@@ -492,7 +491,7 @@ StateManager::onGetNodeState(const api::GetNodeStateCommand::SP& cmd)
return true;
}
-void StateManager::mark_controller_as_having_observed_explicit_node_state(uint16_t controller_index) {
+void StateManager::mark_controller_as_having_observed_explicit_node_state(const vespalib::LockGuard &, uint16_t controller_index) {
_controllers_observed_explicit_node_state.emplace(controller_index);
}
@@ -557,7 +556,7 @@ StateManager::sendGetNodeStateReplies(framework::MilliSecTime olderThanTime,
{
std::vector<std::shared_ptr<api::GetNodeStateReply>> replies;
{
- vespalib::MonitorGuard guard(_stateLock);
+ vespalib::LockGuard guard(_stateLock);
for (auto it = _queuedStateRequests.begin(); it != _queuedStateRequests.end();) {
if (node != 0xffff && node != it->second->getSourceIndex()) {
++it;
@@ -567,7 +566,7 @@ StateManager::sendGetNodeStateReplies(framework::MilliSecTime olderThanTime,
replies.emplace_back(std::make_shared<api::GetNodeStateReply>(*it->second, *_nodeState));
auto eraseIt = it++;
- mark_controller_as_having_observed_explicit_node_state(eraseIt->second->getSourceIndex());
+ mark_controller_as_having_observed_explicit_node_state(guard, eraseIt->second->getSourceIndex());
_queuedStateRequests.erase(eraseIt);
} else {
++it;
diff --git a/storage/src/vespa/storage/storageserver/statemanager.h b/storage/src/vespa/storage/storageserver/statemanager.h
index 57f0e02a136..3d231c070ef 100644
--- a/storage/src/vespa/storage/storageserver/statemanager.h
+++ b/storage/src/vespa/storage/storageserver/statemanager.h
@@ -106,7 +106,7 @@ private:
bool sendGetNodeStateReplies(
framework::MilliSecTime olderThanTime = framework::MilliSecTime(0),
uint16_t index = 0xffff);
- void mark_controller_as_having_observed_explicit_node_state(uint16_t controller_index);
+ void mark_controller_as_having_observed_explicit_node_state(const vespalib::LockGuard &, uint16_t controller_index);
lib::Node thisNode() const;