From 909dc02b229f20b52b454c4142b2f7b39187f4ab Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 5 Jun 2020 06:52:55 +0300 Subject: [PATCH] Fix stopping of MultiPromiseActor only after and not before it is used again after setting result. GitOrigin-RevId: 9c7895906911d75b3a8d6077eba113814070df23 --- tdactor/td/actor/MultiPromise.cpp | 13 ++++++++++++- tdactor/td/actor/MultiPromise.h | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tdactor/td/actor/MultiPromise.cpp b/tdactor/td/actor/MultiPromise.cpp index 07184f1e8..beed4d2a8 100644 --- a/tdactor/td/actor/MultiPromise.cpp +++ b/tdactor/td/actor/MultiPromise.cpp @@ -10,6 +10,7 @@ namespace td { void MultiPromiseActor::add_promise(Promise &&promise) { promises_.emplace_back(std::move(promise)); + LOG(DEBUG) << "Add promise #" << promises_.size() << " to " << name_; } Promise MultiPromiseActor::get_promise() { @@ -24,11 +25,13 @@ Promise MultiPromiseActor::get_promise() { future.set_event(EventCreator::raw(actor_id(), nullptr)); futures_.emplace_back(std::move(future)); + LOG(DEBUG) << "Get promise #" << futures_.size() << " for " << name_; return PromiseCreator::from_promise_actor(std::move(promise)); } void MultiPromiseActor::raw_event(const Event::Raw &event) { received_results_++; + LOG(DEBUG) << "Receive result #" << received_results_ << " out of " << futures_.size() << " for " << name_; if (received_results_ == futures_.size()) { if (!ignore_errors_) { for (auto &future : futures_) { @@ -47,13 +50,21 @@ void MultiPromiseActor::set_ignore_errors(bool ignore_errors) { } void MultiPromiseActor::set_result(Result &&result) { + result_ = std::move(result); + stop(); +} + +void MultiPromiseActor::tear_down() { + LOG(DEBUG) << "Set result for " << promises_.size() << " promises in " << name_; + // MultiPromiseActor should be cleared before it begins to send out result auto promises_copy = std::move(promises_); promises_.clear(); auto futures_copy = std::move(futures_); futures_.clear(); received_results_ = 0; - stop(); + auto result = std::move(result_); + result_ = Unit(); if (!promises_copy.empty()) { for (size_t i = 0; i + 1 < promises_copy.size(); i++) { diff --git a/tdactor/td/actor/MultiPromise.h b/tdactor/td/actor/MultiPromise.h index d231cafd5..84414c05c 100644 --- a/tdactor/td/actor/MultiPromise.h +++ b/tdactor/td/actor/MultiPromise.h @@ -77,9 +77,12 @@ class MultiPromiseActor final vector> futures_; // futures waiting for result of the queries size_t received_results_ = 0; bool ignore_errors_ = false; + Result result_; void raw_event(const Event::Raw &event) override; + void tear_down() override; + void on_start_migrate(int32) override { UNREACHABLE(); }