summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-06-28 11:08:20 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2016-06-28 11:08:20 +0000
commit05cd22a4aab1976ec15b02f232c12891b6e03a78 (patch)
treef183ce12dd4331af7cf4f65d4a1234d74956abd1
parent3962f601fa92e8aba19e3efc230840b9f4f5a5a7 (diff)
We must use the same fieldId space for both insert and remove.
This is essential as the fieldId selects the correct thread. If not race conditions are next.
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/documentinverter.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.h1
3 files changed, 26 insertions, 4 deletions
diff --git a/searchlib/src/vespa/searchlib/memoryindex/documentinverter.cpp b/searchlib/src/vespa/searchlib/memoryindex/documentinverter.cpp
index a32676baccf..83b26a82a48 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/documentinverter.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/documentinverter.cpp
@@ -167,12 +167,20 @@ DocumentInverter::invertDocument(uint32_t docId, const Document &doc)
void
DocumentInverter::removeDocument(uint32_t docId)
{
- uint32_t fieldId = 0;
- for (auto &inverter : _inverters) {
+ for (uint32_t fieldId : _schemaIndexFields._textFields) {
+ FieldInverter *inverter = _inverters[fieldId].get();
_invertThreads.execute(fieldId,
- [inverter(inverter.get()), docId]()
+ [inverter, docId]()
{ inverter->removeDocument(docId); });
- ++fieldId;
+ }
+ uint32_t urlId = 0;
+ for (const auto & fi : _schemaIndexFields._uriFields) {
+ uint32_t fieldId = fi._all;
+ UrlFieldInverter *inverter = _urlInverters[urlId].get();
+ _invertThreads.execute(fieldId,
+ [inverter, docId]()
+ { inverter->removeDocument(docId); });
+ ++urlId;
}
}
diff --git a/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.cpp b/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.cpp
index d31a69c9ff6..80642ac6330 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.cpp
@@ -354,6 +354,19 @@ UrlFieldInverter::invertField(uint32_t docId, const FieldValue::UP &val)
endDoc();
}
+void
+UrlFieldInverter::removeDocument(uint32_t docId)
+{
+ _all->removeDocument(docId);
+ _scheme->removeDocument(docId);
+ _host->removeDocument(docId);
+ _port->removeDocument(docId);
+ _path->removeDocument(docId);
+ _query->removeDocument(docId);
+ _fragment->removeDocument(docId);
+ _hostname->removeDocument(docId);
+}
+
UrlFieldInverter::UrlFieldInverter(index::Schema::CollectionType collectionType,
FieldInverter *all,
diff --git a/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.h b/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.h
index 107000cb775..c5493df541c 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.h
+++ b/searchlib/src/vespa/searchlib/memoryindex/urlfieldinverter.h
@@ -67,6 +67,7 @@ public:
FieldInverter *hostname);
void invertField(uint32_t docId, const document::FieldValue::UP &field);
+ void removeDocument(uint32_t docId);
void setUseAnnotations(bool useAnnotations) {
_useAnnotations = useAnnotations;