summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-06-22 12:36:03 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2016-06-22 12:36:03 +0200
commitf8f4ad4c4ab14fde3f54a0074df50809d5862ecf (patch)
tree70929e9ec4d65e5d5ce03721ead2b15d2254bb09 /searchcore
parent3c62ec294306e957e376fb79501758d4f90ebd28 (diff)
Retake guard to ensure that we have not moved.
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;