diff options
author | Tor Egge <Tor.Egge@oath.com> | 2017-08-25 10:32:52 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2017-08-25 10:53:51 +0000 |
commit | 2b3425cfccadde711f3ce8385dbef17efd982a68 (patch) | |
tree | 7a7b016d0396748ba7856c679b3855358af364a1 /searchlib | |
parent | d3ad2fc3531bbcd7da8eb4bed92f24d53d455710 (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.cpp | 6 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/reference_mappings.h | 9 |
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; } }; |