summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@vespa.ai>2024-04-10 09:51:33 +0000
committerTor Brede Vekterli <vekterli@vespa.ai>2024-04-10 09:52:17 +0000
commit496309291cb7171bf25b0f73b1465e64c978fdfc (patch)
tree7e9caded3516e39417ccdc83d492fddce4e18b14
parente5597498f44f5e34d87c64fcbd8d6643417e7baf (diff)
Ensure parameter evaluation order does not have side effects
-rw-r--r--storage/src/vespa/storage/persistence/persistencehandler.cpp4
-rw-r--r--storage/src/vespa/storage/persistence/persistenceutil.cpp3
-rw-r--r--storage/src/vespa/storage/persistence/persistenceutil.h4
3 files changed, 7 insertions, 4 deletions
diff --git a/storage/src/vespa/storage/persistence/persistencehandler.cpp b/storage/src/vespa/storage/persistence/persistencehandler.cpp
index 4761937075d..a01a4656d01 100644
--- a/storage/src/vespa/storage/persistence/persistencehandler.cpp
+++ b/storage/src/vespa/storage/persistence/persistencehandler.cpp
@@ -183,8 +183,8 @@ PersistenceHandler::process_locked_message_batch(std::shared_ptr<FileStorHandler
// Important: we _copy_ the message shared_ptr instead of moving to ensure that `*bm.first` remains
// valid even if the tracker is destroyed by an exception in processMessage(). All std::exceptions
// are caught there, so we do not expect our loop to be interrupted.
- auto tracker = std::make_unique<MessageTracker>(framework::MilliSecTimer(_clock), _env,
- batch, bm.first, std::move(bm.second));
+ auto tracker = std::make_unique<MessageTracker>(framework::MilliSecTimer(_clock), _env, batch,
+ batch->deferred_sender_stub(), bm.first, std::move(bm.second));
tracker = processMessage(*bm.first, std::move(tracker));
if (tracker) {
tracker->sendReply(); // Actually defers to batch reply queue
diff --git a/storage/src/vespa/storage/persistence/persistenceutil.cpp b/storage/src/vespa/storage/persistence/persistenceutil.cpp
index 54bce72d7ff..febc494aff1 100644
--- a/storage/src/vespa/storage/persistence/persistenceutil.cpp
+++ b/storage/src/vespa/storage/persistence/persistenceutil.cpp
@@ -70,9 +70,10 @@ MessageTracker::MessageTracker(const framework::MilliSecTimer & timer,
MessageTracker::MessageTracker(const framework::MilliSecTimer& timer,
const PersistenceUtil& env,
std::shared_ptr<AsyncMessageBatch> batch,
+ MessageSender& deferred_reply_sender,
std::shared_ptr<api::StorageMessage> msg,
ThrottleToken throttle_token)
- : MessageTracker(timer, env, batch->deferred_sender_stub(), false, {}, std::move(batch), std::move(msg), std::move(throttle_token))
+ : MessageTracker(timer, env, deferred_reply_sender, false, {}, std::move(batch), std::move(msg), std::move(throttle_token))
{}
MessageTracker::MessageTracker(const framework::MilliSecTimer & timer,
diff --git a/storage/src/vespa/storage/persistence/persistenceutil.h b/storage/src/vespa/storage/persistence/persistenceutil.h
index 71e5c2754e9..67e96befe00 100644
--- a/storage/src/vespa/storage/persistence/persistenceutil.h
+++ b/storage/src/vespa/storage/persistence/persistenceutil.h
@@ -68,7 +68,9 @@ public:
// For use with batching where bucket lock is held separately and bucket info
// is _not_ fetched or updated per message.
MessageTracker(const framework::MilliSecTimer& timer, const PersistenceUtil& env,
- std::shared_ptr<AsyncMessageBatch> batch, std::shared_ptr<api::StorageMessage> msg,
+ std::shared_ptr<AsyncMessageBatch> batch,
+ MessageSender& deferred_reply_sender,
+ std::shared_ptr<api::StorageMessage> msg,
ThrottleToken throttle_token);
~MessageTracker();