summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2017-08-25 10:32:52 +0000
committerTor Egge <Tor.Egge@oath.com>2017-08-25 10:53:51 +0000
commit2b3425cfccadde711f3ce8385dbef17efd982a68 (patch)
tree7a7b016d0396748ba7856c679b3855358af364a1 /searchlib
parentd3ad2fc3531bbcd7da8eb4bed92f24d53d455710 (diff)
Avoid race between readers and writer that could cause reader to read
uninitialized or unmapped data when accessing _reverseMappingIndices.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_mappings.h9
2 files changed, 13 insertions, 2 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp b/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp
index 03acf6f2167..4edd9d45e60 100644
--- a/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp
@@ -9,6 +9,7 @@ namespace search::attribute {
ReferenceMappings::ReferenceMappings(GenerationHolder &genHolder)
: _reverseMappingIndices(genHolder),
+ _referencedLidLimit(0),
_reverseMapping(),
_referencedLids(genHolder)
{
@@ -38,7 +39,6 @@ ReferenceMappings::syncForwardMapping(const Reference &entry)
{ referencedLids[lid] = referencedLid; });
}
-
void
ReferenceMappings::syncReverseMappingIndices(const Reference &entry)
{
@@ -46,6 +46,10 @@ ReferenceMappings::syncReverseMappingIndices(const Reference &entry)
if (referencedLid != 0u) {
_reverseMappingIndices.ensure_size(referencedLid + 1);
_reverseMappingIndices[referencedLid] = entry.revMapIdx();
+ if (referencedLid >= _referencedLidLimit) {
+ std::atomic_thread_fence(std::memory_order_release);
+ _referencedLidLimit = referencedLid + 1;
+ }
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/reference_mappings.h b/searchlib/src/vespa/searchlib/attribute/reference_mappings.h
index 97fdb77e78d..3190e1b5a83 100644
--- a/searchlib/src/vespa/searchlib/attribute/reference_mappings.h
+++ b/searchlib/src/vespa/searchlib/attribute/reference_mappings.h
@@ -4,6 +4,7 @@
#include <vespa/searchlib/btree/btreestore.h>
#include <vespa/searchlib/common/rcuvector.h>
+#include <atomic>
namespace search::attribute {
@@ -27,6 +28,8 @@ class ReferenceMappings
// Vector containing references to trees of lids referencing given
// referenced lid.
ReverseMappingIndices _reverseMappingIndices;
+ // limit for referenced lid when accessing _reverseMappingIndices
+ uint32_t _referencedLidLimit;
// Store of B-Trees, used to map from gid or referenced lid to
// referencing lids.
ReverseMapping _reverseMapping;
@@ -77,7 +80,11 @@ public:
ReferencedLids getReferencedLids() const { return ReferencedLids(&_referencedLids[0], _referencedLids.size()); }
uint32_t getReferencedLid(uint32_t doc) const { return _referencedLids[doc]; }
- ReverseMappingRefs getReverseMappingRefs() const { return ReverseMappingRefs(&_reverseMappingIndices[0], _reverseMappingIndices.size()); }
+ ReverseMappingRefs getReverseMappingRefs() const {
+ uint32_t referencedLidLimit = _referencedLidLimit;
+ std::atomic_thread_fence(std::memory_order_acquire);
+ return ReverseMappingRefs(&_reverseMappingIndices[0], referencedLidLimit);
+ }
const ReverseMapping &getReverseMapping() const { return _reverseMapping; }
};