diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-04 14:10:59 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-04 14:10:59 +0000 |
commit | 1aa8b0b11575b3c1e6a0d991d7b655a9290c85d9 (patch) | |
tree | 6e6a7f41701c410e17d6bbae58007671727d03b2 /storage | |
parent | f57ad042b46830003497d2b5e47cd5157fa12054 (diff) |
Ensure that eval order might cause object to disappear under your feet by taking an reference when it is safe.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/src/vespa/storage/persistence/persistencethread.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/storage/src/vespa/storage/persistence/persistencethread.cpp b/storage/src/vespa/storage/persistence/persistencethread.cpp index c9afdf42651..4a99655c775 100644 --- a/storage/src/vespa/storage/persistence/persistencethread.cpp +++ b/storage/src/vespa/storage/persistence/persistencethread.cpp @@ -166,31 +166,32 @@ PersistenceThread::tasConditionMatches(const api::TestAndSetCommand & cmd, Messa } MessageTracker::UP -PersistenceThread::handlePut(api::PutCommand& cmd, MessageTracker::UP tracker) +PersistenceThread::handlePut(api::PutCommand& cmd, MessageTracker::UP trackerUP) { + MessageTracker & tracker = *trackerUP; auto& metrics = _env._metrics.put[cmd.getLoadType()]; - tracker->setMetric(metrics); + tracker.setMetric(metrics); metrics.request_size.addValue(cmd.getApproxByteSize()); - if (tasConditionExists(cmd) && !tasConditionMatches(cmd, *tracker, tracker->context())) { - return tracker; + if (tasConditionExists(cmd) && !tasConditionMatches(cmd, tracker, tracker.context())) { + return trackerUP; } if (_sequencedExecutor == nullptr) { spi::Result response = _spi.put(getBucket(cmd.getDocumentId(), cmd.getBucket()), spi::Timestamp(cmd.getTimestamp()), std::move(cmd.getDocument()), - tracker->context()); - tracker->checkForError(response); + tracker.context()); + tracker.checkForError(response); } else { _spi.putAsync(getBucket(cmd.getDocumentId(), cmd.getBucket()), spi::Timestamp(cmd.getTimestamp()), - std::move(cmd.getDocument()), tracker->context(), + std::move(cmd.getDocument()), tracker.context(), std::make_unique<ResultTaskOperationDone>(*_sequencedExecutor, cmd.getBucketId(), - makeResultTask([tracker = std::move(tracker)](spi::Result::UP response) { + makeResultTask([tracker = std::move(trackerUP)](spi::Result::UP response) { tracker->checkForError(*response); tracker->sendReply(); }))); } - return tracker; + return trackerUP; } MessageTracker::UP |