summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-05-04 14:10:59 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-05-04 14:10:59 +0000
commit1aa8b0b11575b3c1e6a0d991d7b655a9290c85d9 (patch)
tree6e6a7f41701c410e17d6bbae58007671727d03b2
parentf57ad042b46830003497d2b5e47cd5157fa12054 (diff)
Ensure that eval order might cause object to disappear under your feet by taking an reference when it is safe.
-rw-r--r--configdefinitions/src/vespa/stor-filestor.def2
-rw-r--r--storage/src/vespa/storage/persistence/persistencethread.cpp19
2 files changed, 11 insertions, 10 deletions
diff --git a/configdefinitions/src/vespa/stor-filestor.def b/configdefinitions/src/vespa/stor-filestor.def
index 56f82d9e9cf..80ddc0931f4 100644
--- a/configdefinitions/src/vespa/stor-filestor.def
+++ b/configdefinitions/src/vespa/stor-filestor.def
@@ -26,7 +26,7 @@ disk_operation_timeout int default=0 restart
## Number of threads to use for each mountpoint.
num_threads int default=8 restart
-## Number of thread for response processing and delivery
+## Number of threads for response processing and delivery
## 0 will give legacy sync behavior.
## Negative number will choose a good number based on # cores.
num_response_threads int default=0
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