RequestActor: add checks
GitOrigin-RevId: 16b850d775030948afcaea79695e5961d9652c70
This commit is contained in:
parent
a0a446f987
commit
36cc950820
@ -30,13 +30,15 @@ class RequestActor : public Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loop() override {
|
void loop() override {
|
||||||
PromiseActor<T> promise;
|
PromiseActor<T> promise_actor;
|
||||||
FutureActor<T> future;
|
FutureActor<T> future;
|
||||||
init_promise_future(&promise, &future);
|
init_promise_future(&promise_actor, &future);
|
||||||
|
|
||||||
do_run(PromiseCreator::from_promise_actor(std::move(promise)));
|
auto promise = PromiseCreator::from_promise_actor(std::move(promise_actor));
|
||||||
|
do_run(std::move(promise));
|
||||||
|
|
||||||
if (future.is_ready()) {
|
if (future.is_ready()) {
|
||||||
|
CHECK(!promise);
|
||||||
if (future.is_error()) {
|
if (future.is_error()) {
|
||||||
do_send_error(future.move_as_error());
|
do_send_error(future.move_as_error());
|
||||||
} else {
|
} else {
|
||||||
@ -45,6 +47,9 @@ class RequestActor : public Actor {
|
|||||||
}
|
}
|
||||||
stop();
|
stop();
|
||||||
} else {
|
} else {
|
||||||
|
LOG_CHECK(!promise.was_set_value) << future.empty() << " " << future.get_state();
|
||||||
|
CHECK(!future.empty());
|
||||||
|
CHECK(future.get_state() == FutureActor<T>::State::Waiting);
|
||||||
if (--tries_left_ == 0) {
|
if (--tries_left_ == 0) {
|
||||||
future.close();
|
future.close();
|
||||||
do_send_error(Status::Error(400, "Requested data is inaccessible"));
|
do_send_error(Status::Error(400, "Requested data is inaccessible"));
|
||||||
|
@ -62,10 +62,12 @@ class SafePromise;
|
|||||||
template <class T = Unit>
|
template <class T = Unit>
|
||||||
class Promise {
|
class Promise {
|
||||||
public:
|
public:
|
||||||
|
bool was_set_value{false};
|
||||||
void set_value(T &&value) {
|
void set_value(T &&value) {
|
||||||
if (!promise_) {
|
if (!promise_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
was_set_value = true;
|
||||||
promise_->set_value(std::move(value));
|
promise_->set_value(std::move(value));
|
||||||
promise_.reset();
|
promise_.reset();
|
||||||
}
|
}
|
||||||
@ -73,6 +75,7 @@ class Promise {
|
|||||||
if (!promise_) {
|
if (!promise_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
was_set_value = true;
|
||||||
promise_->set_error(std::move(error));
|
promise_->set_error(std::move(error));
|
||||||
promise_.reset();
|
promise_.reset();
|
||||||
}
|
}
|
||||||
@ -80,6 +83,7 @@ class Promise {
|
|||||||
if (!promise_) {
|
if (!promise_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
was_set_value = true;
|
||||||
promise_->set_result(std::move(result));
|
promise_->set_result(std::move(result));
|
||||||
promise_.reset();
|
promise_.reset();
|
||||||
}
|
}
|
||||||
@ -404,9 +408,9 @@ class PromiseActor final : public PromiseInterface<T> {
|
|||||||
template <class T>
|
template <class T>
|
||||||
class FutureActor final : public Actor {
|
class FutureActor final : public Actor {
|
||||||
friend class PromiseActor<T>;
|
friend class PromiseActor<T>;
|
||||||
|
public:
|
||||||
enum State { Waiting, Ready };
|
enum State { Waiting, Ready };
|
||||||
|
|
||||||
public:
|
|
||||||
static constexpr int Hangup = 426487;
|
static constexpr int Hangup = 426487;
|
||||||
|
|
||||||
FutureActor() = default;
|
FutureActor() = default;
|
||||||
@ -457,6 +461,10 @@ class FutureActor final : public Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
State get_state() const {
|
||||||
|
return state_;
|
||||||
|
}
|
||||||
|
|
||||||
template <class S>
|
template <class S>
|
||||||
friend void init_promise_future(PromiseActor<S> *promise, FutureActor<S> *future);
|
friend void init_promise_future(PromiseActor<S> *promise, FutureActor<S> *future);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user