summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-11-11 16:09:08 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-11-11 16:09:08 +0000
commit57ab1694b78bceb66cc562b75ce453125217fa18 (patch)
tree63c8bb89d461c17c6ffc190e8a9aa369295fcf65 /searchlib
parent923e66e078e7b9cc0dbc6399432c9e3172f62658 (diff)
Improve protection of _parts map.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domain.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domain.h1
2 files changed, 13 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/transactionlog/domain.cpp b/searchlib/src/vespa/searchlib/transactionlog/domain.cpp
index 07da8087544..9f1e6bde06b 100644
--- a/searchlib/src/vespa/searchlib/transactionlog/domain.cpp
+++ b/searchlib/src/vespa/searchlib/transactionlog/domain.cpp
@@ -215,7 +215,7 @@ Domain::triggerSyncNow()
std::unique_lock guard(_syncMonitor);
if (!_pendingSync) {
_pendingSync = true;
- _executor.execute(makeLambdaTask([this, domainPart=_parts.rbegin()->second]() {
+ _executor.execute(makeLambdaTask([this, domainPart= getActivePart()]() {
domainPart->sync();
std::lock_guard monitorGuard(_syncMonitor);
_pendingSync = false;
@@ -242,6 +242,12 @@ Domain::findPart(SerialNum s)
return DomainPart::SP();
}
+DomainPart::SP
+Domain::getActivePart() {
+ std::lock_guard guard(_lock);
+ return _parts.rbegin()->second;
+}
+
uint64_t
Domain::size() const
{
@@ -307,7 +313,7 @@ waitPendingSync(std::mutex &syncMonitor, std::condition_variable & syncCond, boo
DomainPart::SP
Domain::optionallyRotateFile(SerialNum serialNum) {
- DomainPart::SP dp(_parts.rbegin()->second);
+ DomainPart::SP dp = getActivePart();
if (dp->byteSize() > _config.getPartSizeLimit()) {
waitPendingSync(_syncMonitor, _syncCond, _pendingSync);
triggerSyncNow();
@@ -404,14 +410,14 @@ Domain::erase(SerialNum to)
{
bool retval(true);
/// Do not erase the last element
+ UniqueLock guard(_lock);
for (DomainPartList::iterator it(_parts.begin()); (_parts.size() > 1) && (it->second.get()->range().to() < to); it = _parts.begin()) {
DomainPart::SP dp(it->second);
- {
- std::lock_guard guard(_lock);
- _parts.erase(it);
- }
+ _parts.erase(it);
+ guard.unlock();
retval = retval && dp->erase(to);
vespalib::File::sync(dir());
+ guard.lock();
}
if (_parts.begin()->second->range().to() >= to) {
_parts.begin()->second->erase(to);
diff --git a/searchlib/src/vespa/searchlib/transactionlog/domain.h b/searchlib/src/vespa/searchlib/transactionlog/domain.h
index 432787f8619..c9eb6385b15 100644
--- a/searchlib/src/vespa/searchlib/transactionlog/domain.h
+++ b/searchlib/src/vespa/searchlib/transactionlog/domain.h
@@ -58,6 +58,7 @@ public:
Domain & setConfig(const DomainConfig & cfg);
private:
using UniqueLock = std::unique_lock<std::mutex>;
+ DomainPartSP getActivePart();
void verifyLock(const UniqueLock & guard) const;
void commitIfFull(const UniqueLock & guard);
void commitAndTransferResponses(const UniqueLock & guard);