Page MenuHomePhorge

D3582.1765363063.diff
No OneTemporary

Size
7 KB
Referenced Files
None
Subscribers
None

D3582.1765363063.diff

diff --git a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerBidiReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
--- a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
+++ b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
@@ -42,6 +42,7 @@
virtual std::unique_ptr<ServerBidiReactorStatus>
handleRequest(Request request, Response *response) = 0;
virtual void initialize(){};
+ virtual void validate(){};
virtual void doneCallback(){};
virtual void terminateCallback(){};
};
@@ -61,10 +62,13 @@
template <class Request, class Response>
void ServerBidiReactorBase<Request, Response>::terminate(
ServerBidiReactorStatus status) {
- this->terminateCallback();
this->status = status;
- if (!this->status.status.ok()) {
- std::cout << "error: " << this->status.status.error_message() << std::endl;
+ this->terminateCallback();
+ try {
+ this->validate();
+ } catch (std::runtime_error &e) {
+ this->status = ServerBidiReactorStatus(
+ grpc::Status(grpc::StatusCode::INTERNAL, e.what()));
}
if (this->status.sendLastResponse) {
this->StartWriteAndFinish(
@@ -78,8 +82,10 @@
void ServerBidiReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
this->readingAborted = true;
- this->terminate(ServerBidiReactorStatus(
- grpc::Status(grpc::StatusCode::ABORTED, "no more reads")));
+ // Ending a connection on the other side results in the `ok` flag being set
+ // to false. It makes it impossible to detect a failure based just on the
+ // flag. We should manually check if the data we received is valid
+ this->terminate(ServerBidiReactorStatus(grpc::Status::OK));
return;
}
try {
diff --git a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerReadReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerReadReactorBase.h
--- a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerReadReactorBase.h
+++ b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerReadReactorBase.h
@@ -28,17 +28,23 @@
virtual std::unique_ptr<grpc::Status> readRequest(Request request) = 0;
virtual void initialize(){};
+ virtual void validate(){};
virtual void doneCallback(){};
virtual void terminateCallback(){};
};
template <class Request, class Response>
void ServerReadReactorBase<Request, Response>::terminate(grpc::Status status) {
+ this->status = status;
this->terminateCallback();
+ try {
+ this->validate();
+ } catch (std::runtime_error &e) {
+ this->status = grpc::Status(grpc::StatusCode::INTERNAL, e.what());
+ }
if (!this->status.ok()) {
std::cout << "error: " << this->status.error_message() << std::endl;
}
- this->status = status;
this->Finish(status);
}
@@ -59,7 +65,10 @@
template <class Request, class Response>
void ServerReadReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
- this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, "reading error"));
+ // Ending a connection on the other side results in the `ok` flag being set
+ // to false. It makes it impossible to detect a failure based just on the
+ // flag. We should manually check if the data we received is valid
+ this->terminate(grpc::Status::OK);
return;
}
try {
diff --git a/services/blob/src/Reactors/server/base-reactors/ServerBidiReactorBase.h b/services/blob/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
--- a/services/blob/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
+++ b/services/blob/src/Reactors/server/base-reactors/ServerBidiReactorBase.h
@@ -11,8 +11,8 @@
namespace reactor {
struct ServerBidiReactorStatus {
- grpc::Status status = grpc::Status::OK;
- bool sendLastResponse = false;
+ grpc::Status status;
+ bool sendLastResponse;
ServerBidiReactorStatus(
grpc::Status status = grpc::Status::OK,
bool sendLastResponse = false)
@@ -42,6 +42,7 @@
virtual std::unique_ptr<ServerBidiReactorStatus>
handleRequest(Request request, Response *response) = 0;
virtual void initialize(){};
+ virtual void validate(){};
virtual void doneCallback(){};
virtual void terminateCallback(){};
};
@@ -61,10 +62,13 @@
template <class Request, class Response>
void ServerBidiReactorBase<Request, Response>::terminate(
ServerBidiReactorStatus status) {
- this->terminateCallback();
this->status = status;
- if (!this->status.status.ok()) {
- std::cout << "error: " << this->status.status.error_message() << std::endl;
+ this->terminateCallback();
+ try {
+ this->validate();
+ } catch (std::runtime_error &e) {
+ this->status = ServerBidiReactorStatus(
+ grpc::Status(grpc::StatusCode::INTERNAL, e.what()));
}
if (this->status.sendLastResponse) {
this->StartWriteAndFinish(
@@ -78,8 +82,10 @@
void ServerBidiReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
this->readingAborted = true;
- this->terminate(ServerBidiReactorStatus(
- grpc::Status(grpc::StatusCode::ABORTED, "no more reads")));
+ // Ending a connection on the other side results in the `ok` flag being set
+ // to false. It makes it impossible to detect a failure based just on the
+ // flag. We should manually check if the data we received is valid
+ this->terminate(ServerBidiReactorStatus(grpc::Status::OK));
return;
}
try {
diff --git a/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h b/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h
--- a/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h
+++ b/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h
@@ -28,17 +28,23 @@
virtual std::unique_ptr<grpc::Status> readRequest(Request request) = 0;
virtual void initialize(){};
+ virtual void validate(){};
virtual void doneCallback(){};
virtual void terminateCallback(){};
};
template <class Request, class Response>
void ServerReadReactorBase<Request, Response>::terminate(grpc::Status status) {
+ this->status = status;
this->terminateCallback();
+ try {
+ this->validate();
+ } catch (std::runtime_error &e) {
+ this->status = grpc::Status(grpc::StatusCode::INTERNAL, e.what());
+ }
if (!this->status.ok()) {
std::cout << "error: " << this->status.error_message() << std::endl;
}
- this->status = status;
this->Finish(status);
}
@@ -59,7 +65,10 @@
template <class Request, class Response>
void ServerReadReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
- this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, "reading error"));
+ // Ending a connection on the other side results in the `ok` flag being set
+ // to false. It makes it impossible to detect a failure based just on the
+ // flag. We should manually check if the data we received is valid
+ this->terminate(grpc::Status::OK);
return;
}
try {

File Metadata

Mime Type
text/plain
Expires
Wed, Dec 10, 10:37 AM (18 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5863046
Default Alt Text
D3582.1765363063.diff (7 KB)

Event Timeline