diff options
author | Tor Brede Vekterli <vekterli@vespa.ai> | 2024-04-10 09:51:33 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@vespa.ai> | 2024-04-10 09:52:17 +0000 |
commit | 496309291cb7171bf25b0f73b1465e64c978fdfc (patch) | |
tree | 7e9caded3516e39417ccdc83d492fddce4e18b14 | |
parent | e5597498f44f5e34d87c64fcbd8d6643417e7baf (diff) |
Ensure parameter evaluation order does not have side effects
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(); |