summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-05-04 14:04:29 +0200
committerTor Egge <Tor.Egge@online.no>2022-05-04 14:04:29 +0200
commit358ac06833e12a35bcafd5971a4a9ca3550eea96 (patch)
tree2f46b16d5188615ed36b6d1d4395ba5695895640 /searchlib/src
parent7585981b32937d2b13da1a8f94b42c8a0833a4c2 (diff)
Use atomic variables for search::transactionlog::DomainPart range.
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domainpart.cpp24
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domainpart.h9
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;