diff options
author | Tor Egge <Tor.Egge@oath.com> | 2017-12-07 11:20:23 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2017-12-07 11:20:23 +0000 |
commit | 571f40e3af521f8383d9317c6e5fbc84747de80e (patch) | |
tree | 9c80a658b7d4a22ce04628b8490de93e419eb2cc | |
parent | 3509f17b3ba18a96dc1f52e7b0e23d679e020e8c (diff) |
Protect vector of earlier protocols with a lock, to avoid race conditions.
-rw-r--r-- | storage/src/vespa/storage/storageserver/communicationmanager.cpp | 7 | ||||
-rw-r--r-- | storage/src/vespa/storage/storageserver/communicationmanager.h | 7 |
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; |