diff options
author | Tor Egge <Tor.Egge@oath.com> | 2018-06-04 13:30:36 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2018-06-04 13:30:36 +0000 |
commit | f5225aa6ccb582491df65196e381a45b053cdb2b (patch) | |
tree | ff952f54c0bf4a4d5014c8e6d6a6a9269a3d8b1f /searchcore | |
parent | d4297ad79053fd359abf6cdf43bb5428461682e5 (diff) |
Document field extractor must be kept alive until put task is done.
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp index 35f5f09fc37..0527feb7ba9 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp @@ -217,26 +217,29 @@ class PutTask : public vespalib::Executor::Task const bool _immediateCommit; const bool _allAttributes; std::remove_reference_t<AttributeWriter::OnWriteDoneType> _onWriteDone; + std::shared_ptr<DocumentFieldExtractor> _fieldExtractor; std::vector<FieldValue::UP> _fieldValues; public: - PutTask(const AttributeWriter::WriteContext &wc, SerialNum serialNum, DocumentFieldExtractor &fieldExtractor, uint32_t lid, bool immediateCommit, bool allAttributes, AttributeWriter::OnWriteDoneType onWriteDone); + PutTask(const AttributeWriter::WriteContext &wc, SerialNum serialNum, std::shared_ptr<DocumentFieldExtractor> fieldExtractor, uint32_t lid, bool immediateCommit, bool allAttributes, AttributeWriter::OnWriteDoneType onWriteDone); virtual ~PutTask() override; virtual void run() override; }; -PutTask::PutTask(const AttributeWriter::WriteContext &wc, SerialNum serialNum, DocumentFieldExtractor &fieldExtractor, uint32_t lid, bool immediateCommit, bool allAttributes, AttributeWriter::OnWriteDoneType onWriteDone) +PutTask::PutTask(const AttributeWriter::WriteContext &wc, SerialNum serialNum, std::shared_ptr<DocumentFieldExtractor> fieldExtractor, uint32_t lid, bool immediateCommit, bool allAttributes, AttributeWriter::OnWriteDoneType onWriteDone) : _wc(wc), _serialNum(serialNum), _lid(lid), _immediateCommit(immediateCommit), _allAttributes(allAttributes), - _onWriteDone(onWriteDone) + _onWriteDone(onWriteDone), + _fieldExtractor(std::move(fieldExtractor)), + _fieldValues() { const auto &fields = _wc.getFields(); _fieldValues.reserve(fields.size()); for (const auto &field : fields) { if (_allAttributes || field.getCompoundAttribute()) { - FieldValue::UP fv = fieldExtractor.getFieldValue(field.getFieldPath()); + FieldValue::UP fv = _fieldExtractor->getFieldValue(field.getFieldPath()); _fieldValues.emplace_back(std::move(fv)); } } @@ -413,7 +416,7 @@ AttributeWriter::internalPut(SerialNum serialNum, const Document &doc, DocumentI if (_dataType != dataType) { buildFieldPaths(doc.getType(), dataType); } - DocumentFieldExtractor extractor(doc); + auto extractor = std::make_shared<DocumentFieldExtractor>(doc); for (const auto &wc : _writeContexts) { if (allAttributes || wc.getHasCompoundAttribute()) { auto putTask = std::make_unique<PutTask>(wc, serialNum, extractor, lid, immediateCommit, allAttributes, onWriteDone); |