diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-06-28 11:08:20 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2016-06-28 11:08:20 +0000 |
commit | 05cd22a4aab1976ec15b02f232c12891b6e03a78 (patch) | |
tree | f183ce12dd4331af7cf4f65d4a1234d74956abd1 | |
parent | 3962f601fa92e8aba19e3efc230840b9f4f5a5a7 (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.
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; |