aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahoo-inc.com>2017-08-03 12:21:10 +0000
committerTor Egge <Tor.Egge@yahoo-inc.com>2017-08-03 12:21:10 +0000
commitc66a01ed3869eac76630d94d3015971860045034 (patch)
tree826dcb6ee1100a00cbae75880d65777e58428e44
parent73bde87baf280b9491d3f2c9fb3a3cd18b96f8c2 (diff)
Set numDocs and committedDocIdLimit when loading reference attribute.
Handle shrinking of reference attribute.
-rw-r--r--searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp26
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_attribute.h2
3 files changed, 29 insertions, 0 deletions
diff --git a/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp b/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp
index 745f6fd3c88..d1ded170c86 100644
--- a/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp
+++ b/searchlib/src/tests/attribute/reference_attribute/reference_attribute_test.cpp
@@ -243,6 +243,7 @@ TEST_F("require that we can save and load attribute", Fixture)
f.commit();
f.save();
f.load();
+ EXPECT_EQUAL(5u, f.attr().getNumDocs());
TEST_DO(f.assertNoRef(3));
TEST_DO(f.assertRef(doc1, 1));
TEST_DO(f.assertRef(doc2, 2));
diff --git a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp
index 92f7bd2ba1c..9f5d9cacd55 100644
--- a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp
@@ -164,6 +164,8 @@ ReferenceAttribute::onLoad()
_indices.push_back(builder.mapEnumValueToEntryRef(enumValue));
}
builder.makeDictionary();
+ setNumDocs(numDocs);
+ setCommittedDocIdLimit(numDocs);
incGeneration();
return true;
}
@@ -276,6 +278,30 @@ ReferenceAttribute::populateReferencedLids()
}
}
+void
+ReferenceAttribute::clearDocs(DocId lidLow, DocId lidLimit)
+{
+ assert(lidLow <= lidLimit);
+ assert(lidLimit <= getNumDocs());
+ for (DocId lid = lidLow; lid < lidLimit; ++lid) {
+ EntryRef oldRef = _indices[lid];
+ if (oldRef.valid()) {
+ _indices[lid] = EntryRef();
+ _store.remove(oldRef);
+ }
+ }
+}
+
+void
+ReferenceAttribute::onShrinkLidSpace()
+{
+ // References for lids > committedDocIdLimit have been cleared.
+ uint32_t committedDocIdLimit = getCommittedDocIdLimit();
+ assert(_indices.size() >= committedDocIdLimit);
+ _indices.shrink(committedDocIdLimit);
+ setNumDocs(committedDocIdLimit);
+}
+
IMPLEMENT_IDENTIFIABLE_ABSTRACT(ReferenceAttribute, AttributeVector);
}
diff --git a/searchlib/src/vespa/searchlib/attribute/reference_attribute.h b/searchlib/src/vespa/searchlib/attribute/reference_attribute.h
index f0e7c22f8f4..0df40cf8b2a 100644
--- a/searchlib/src/vespa/searchlib/attribute/reference_attribute.h
+++ b/searchlib/src/vespa/searchlib/attribute/reference_attribute.h
@@ -84,6 +84,8 @@ public:
DocId getReferencedLid(DocId doc) const;
void notifyGidToLidChange(const GlobalId &gid, DocId referencedLid);
void populateReferencedLids();
+ virtual void clearDocs(DocId lidLow, DocId lidLimit) override;
+ virtual void onShrinkLidSpace() override;
};
}