summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretriever.h4
2 files changed, 7 insertions, 3 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
index 4b031f28900..f0c0e12cf76 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
@@ -123,7 +123,7 @@ void DocumentRetriever::visitDocuments(const LidVector & lids, search::IDocument
_doc_store.visit(lids, getDocumentTypeRepo(), populater);
}
-void DocumentRetriever::populate(DocumentIdT lid, Document & doc) const
+void DocumentRetriever::populate(DocumentIdT lid, Document & doc, ReadConsistency consistency) const
{
for (uint32_t i = 0; i < _schema.getNumAttributeFields(); ++i) {
const Schema::AttributeField &field = _schema.getAttributeField(i);
@@ -131,6 +131,10 @@ void DocumentRetriever::populate(DocumentIdT lid, Document & doc) const
if (attrGuard.get() && attrGuard->valid()) {
const search::attribute::IAttributeVector & attr = **attrGuard;
if (lid < attr.getNumDocs()) {
+ if (consistency != ReadConsistency::STRONG) {
+ // Lock must be retaken to ensure as non-strong consitency allows lids to arrive later on.
+ attrGuard = _attr_manager.getAttribute(field.getName());
+ }
DocumentFieldRetriever::populate(lid, doc, field, attr, _schema.isIndexField(field.getName()));
}
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.h b/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
index 94446a0c738..0a81a9dc845 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.h
@@ -24,8 +24,8 @@ public:
const search::IDocumentStore &doc_store);
document::Document::UP getDocument(search::DocumentIdT lid) const override;
- void visitDocuments(const LidVector & lids, search::IDocumentVisitor & visitor, ReadConsistency) const override;
- void populate(search::DocumentIdT lid, document::Document & doc) const;
+ void visitDocuments(const LidVector & lids, search::IDocumentVisitor & visitor, ReadConsistency consistency) const override;
+ void populate(search::DocumentIdT lid, document::Document & doc, ReadConsistency consistency) const;
private:
const search::index::Schema &_schema;
const search::IAttributeManager &_attr_manager;