diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-13 14:57:47 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-13 14:57:47 +0000 |
commit | f33f5ec3ce70fb0f05110f88d3763138cbc1cd9f (patch) | |
tree | 62b6e9b558c7024d9eaef66f2869afbf22d089c5 | |
parent | 897e890350db20c03b50f90bde875745c373b6f4 (diff) |
Ensure that we hold the lock when calling mark_controller_as_having_observed_explicit_node_state.
-rw-r--r-- | storage/src/vespa/storage/storageserver/statemanager.cpp | 11 | ||||
-rw-r--r-- | storage/src/vespa/storage/storageserver/statemanager.h | 2 |
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; |