summaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2017-12-07 11:20:23 +0000
committerTor Egge <Tor.Egge@oath.com>2017-12-07 11:20:23 +0000
commit571f40e3af521f8383d9317c6e5fbc84747de80e (patch)
tree9c80a658b7d4a22ce04628b8490de93e419eb2cc /storage
parent3509f17b3ba18a96dc1f52e7b0e23d679e020e8c (diff)
Protect vector of earlier protocols with a lock, to avoid race conditions.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/vespa/storage/storageserver/communicationmanager.cpp7
-rw-r--r--storage/src/vespa/storage/storageserver/communicationmanager.h7
2 files changed, 9 insertions, 5 deletions
diff --git a/storage/src/vespa/storage/storageserver/communicationmanager.cpp b/storage/src/vespa/storage/storageserver/communicationmanager.cpp
index b214ef4539a..c19dc7cfd27 100644
--- a/storage/src/vespa/storage/storageserver/communicationmanager.cpp
+++ b/storage/src/vespa/storage/storageserver/communicationmanager.cpp
@@ -738,10 +738,11 @@ CommunicationManager::run(framework::ThreadHandle& thread)
if (_eventQueue.getNext(msg, 100)) {
process(msg);
}
- for (Protocols::iterator it(_earlierGenerations.begin());
+ std::lock_guard<std::mutex> guard(_earlierGenerationsLock);
+ for (EarlierProtocols::iterator it(_earlierGenerations.begin());
!_earlierGenerations.empty() &&
((it->first + TEN_MINUTES) < _component.getClock().getTimeInSeconds());
- _earlierGenerations.begin())
+ it = _earlierGenerations.begin())
{
_earlierGenerations.erase(it);
}
@@ -766,8 +767,8 @@ void CommunicationManager::updateMessagebusProtocol(
if (_mbus.get()) {
framework::SecondTime now(_component.getClock().getTimeInSeconds());
mbus::IProtocol::SP newDocumentProtocol(new documentapi::DocumentProtocol( *_component.getLoadTypes(), repo));
+ std::lock_guard<std::mutex> guard(_earlierGenerationsLock);
_earlierGenerations.push_back(std::make_pair(now, _mbus->getMessageBus().putProtocol(newDocumentProtocol)));
-
mbus::IProtocol::SP newStorageProtocol(new mbusprot::StorageProtocol(repo, *_component.getLoadTypes()));
_earlierGenerations.push_back(std::make_pair(now, _mbus->getMessageBus().putProtocol(newStorageProtocol)));
}
diff --git a/storage/src/vespa/storage/storageserver/communicationmanager.h b/storage/src/vespa/storage/storageserver/communicationmanager.h
index 89b76583cb5..f4f4aa5a236 100644
--- a/storage/src/vespa/storage/storageserver/communicationmanager.h
+++ b/storage/src/vespa/storage/storageserver/communicationmanager.h
@@ -26,6 +26,7 @@
#include <map>
#include <queue>
#include <atomic>
+#include <mutex>
namespace mbus {
class RPCMessageBus;
@@ -138,8 +139,10 @@ private:
PriorityQueue _eventQueue;
// XXX: Should perhaps use a configsubscriber and poll from StorageComponent ?
std::unique_ptr<config::ConfigFetcher> _configFetcher;
- typedef std::vector< std::pair<framework::SecondTime, mbus::IProtocol::SP> > Protocols;
- Protocols _earlierGenerations;
+ using EarlierProtocol = std::pair<framework::SecondTime, mbus::IProtocol::SP>;
+ using EarlierProtocols = std::vector<EarlierProtocol>;
+ std::mutex _earlierGenerationsLock;
+ EarlierProtocols _earlierGenerations;
void onOpen() override;
void onClose() override;