summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2018-06-04 13:30:36 +0000
committerTor Egge <Tor.Egge@oath.com>2018-06-04 13:30:36 +0000
commitf5225aa6ccb582491df65196e381a45b053cdb2b (patch)
treeff952f54c0bf4a4d5014c8e6d6a6a9269a3d8b1f /searchcore
parentd4297ad79053fd359abf6cdf43bb5428461682e5 (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.cpp13
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);