diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-05-05 07:43:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-05 07:43:56 +0200 |
commit | 1c5d2cdce5c5e39d4b98a82b0299f0e7290d93f3 (patch) | |
tree | 48b27f17d5ebc5b79110cb2efdb68b2b8dca8b9a /searchlib/src | |
parent | 139197a8a9e56c7105d729ed92eb2dcda95479c4 (diff) | |
parent | 358ac06833e12a35bcafd5971a4a9ca3550eea96 (diff) |
Merge pull request #22441 from vespa-engine/toregge/use-atomic-variables-for-domainpart-range
Use atomic variables for search::transactionlog::DomainPart range.
Diffstat (limited to 'searchlib/src')
-rw-r--r-- | searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp | 24 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/transactionlog/domainpart.h | 9 |
2 files changed, 21 insertions, 12 deletions
diff --git a/searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp b/searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp index 38b463d6bc2..00bbd5e81d2 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp +++ b/searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp @@ -235,9 +235,9 @@ DomainPart::buildPacketMapping(bool allowTruncate) set_size(size() + packet.size()); const SerialNum firstSerial = packet.range().from(); if (currPos == _headerLen) { - _range.from(firstSerial); + set_range_from(firstSerial); } - _range.to(packet.range().to()); + set_range_to(packet.range().to()); // Called only from constructor so no need to hold lock _skipList.emplace_back(firstSerial, firstPos); } else { @@ -252,7 +252,8 @@ DomainPart::DomainPart(const string & name, const string & baseDir, SerialNum s, const FileHeaderContext &fileHeaderContext, bool allowTruncate) : _lock(), _fileLock(), - _range(s), + _range_from(s), + _range_to(s ? s - 1 : s), _sz(0), _byteSize(0), _fileName(fmt("%s/%s-%016" PRIu64, baseDir.c_str(), name.c_str(), s)), @@ -295,7 +296,7 @@ DomainPart::DomainPart(const string & name, const string & baseDir, SerialNum s, _transLog->GetFileName(), _transLog->GetSize())); } handleSync(*_transLog); - _writtenSerial = _range.to(); + _writtenSerial = get_range_to(); _syncedSerial = _writtenSerial; assert(int64_t(byteSize()) == _transLog->GetSize()); assert(int64_t(byteSize()) == _transLog->GetPosition()); @@ -368,11 +369,14 @@ bool DomainPart::erase(SerialNum to) { bool retval(true); - if (to > _range.to()) { + if (to > get_range_to()) { close(); _transLog->Delete(); } else { - _range.from(std::max(to, _range.from())); + auto range_from = get_range_from(); + if (to > range_from) { + set_range_from(to); + } } return retval; } @@ -383,11 +387,11 @@ DomainPart::commit(const SerializedChunk & serialized) SerialNumRange range = serialized.range(); int64_t firstPos(byteSize()); - assert(_range.to() < range.to()); + assert(get_range_to() < range.to()); set_size(size() + serialized.getNumEntries()); - _range.to(range.to()); - if (_range.from() == 0) { - _range.from(range.from()); + set_range_to(range.to()); + if (get_range_from() == 0) { + set_range_from(range.from()); } write(*_transLog, range, serialized.getData()); diff --git a/searchlib/src/vespa/searchlib/transactionlog/domainpart.h b/searchlib/src/vespa/searchlib/transactionlog/domainpart.h index fd84040228d..4b8d52644a9 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/domainpart.h +++ b/searchlib/src/vespa/searchlib/transactionlog/domainpart.h @@ -30,7 +30,7 @@ public: bool visit(FastOS_FileInterface &file, SerialNumRange &r, Packet &packet); bool close(); void sync(); - SerialNumRange range() const { return _range; } + SerialNumRange range() const { return SerialNumRange(get_range_from(), get_range_to()); } SerialNum getSynced() const { std::lock_guard guard(_writeLock); @@ -52,6 +52,10 @@ private: void write(FastOS_FileInterface &file, SerialNumRange range, vespalib::ConstBufferRef buf); void writeHeader(const common::FileHeaderContext &fileHeaderContext); void set_size(size_t sz) noexcept { _sz.store(sz, std::memory_order_relaxed); } + SerialNum get_range_from() const noexcept { return _range_from.load(std::memory_order_relaxed); } + SerialNum get_range_to() const noexcept { return _range_to.load(std::memory_order_relaxed); } + void set_range_from(SerialNum range_from) noexcept { _range_from.store(range_from, std::memory_order_relaxed); } + void set_range_to(SerialNum range_to) noexcept { _range_to.store(range_to, std::memory_order_relaxed); } class SkipInfo { @@ -72,7 +76,8 @@ private: }; std::mutex _lock; std::mutex _fileLock; - SerialNumRange _range; + std::atomic<SerialNum> _range_from; + std::atomic<SerialNum> _range_to; std::atomic<size_t> _sz; std::atomic<uint64_t> _byteSize; vespalib::string _fileName; |