Page MenuHomePhabricator

D3583.id11383.diff
No OneTemporary

D3583.id11383.diff

diff --git a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientBidiReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientBidiReactorBase.h
--- a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientBidiReactorBase.h
+++ b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientBidiReactorBase.h
@@ -13,7 +13,7 @@
protected:
Request request;
- grpc::Status status;
+ grpc::Status status = grpc::Status::OK;
public:
grpc::ClientContext context;
@@ -51,15 +51,17 @@
template <class Request, class Response>
void ClientBidiReactorBase<Request, Response>::terminate(
const grpc::Status &status) {
- this->terminateCallback();
- if (this->done) {
- return;
+ if (this->status.ok()) {
+ this->status = status;
}
if (!this->status.ok()) {
std::cout << "error: " << this->status.error_message() << std::endl;
}
+ if (this->done) {
+ return;
+ }
+ this->terminateCallback();
this->StartWritesDone();
- this->status = status;
this->done = true;
}
@@ -79,7 +81,10 @@
template <class Request, class Response>
void ClientBidiReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
- this->terminate(grpc::Status(grpc::StatusCode::UNKNOWN, "read 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;
}
this->nextWrite();
diff --git a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientReadReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientReadReactorBase.h
--- a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientReadReactorBase.h
+++ b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientReadReactorBase.h
@@ -7,7 +7,7 @@
template <class Request, class Response>
class ClientReadReactorBase : public grpc::ClientReadReactor<Response> {
Response response;
- grpc::Status status;
+ grpc::Status status = grpc::Status::OK;
bool done = false;
bool initialized = false;
@@ -31,14 +31,16 @@
template <class Request, class Response>
void ClientReadReactorBase<Request, Response>::terminate(
const grpc::Status &status) {
- this->terminateCallback();
- if (this->done) {
- return;
+ if (this->status.ok()) {
+ this->status = status;
}
if (!this->status.ok()) {
std::cout << "error: " << this->status.error_message() << std::endl;
}
- this->status = status;
+ if (this->done) {
+ return;
+ }
+ this->terminateCallback();
this->done = true;
}
@@ -54,7 +56,10 @@
template <class Request, class Response>
void ClientReadReactorBase<Request, Response>::OnReadDone(bool ok) {
if (!ok) {
- this->terminate(grpc::Status(grpc::StatusCode::UNKNOWN, "read 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;
}
std::unique_ptr<grpc::Status> status = this->readResponse(this->response);
diff --git a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientWriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientWriteReactorBase.h
--- a/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientWriteReactorBase.h
+++ b/services/backup/docker-server/contents/server/src/Reactors/client/base-reactors/ClientWriteReactorBase.h
@@ -6,7 +6,7 @@
template <class Request, class Response>
class ClientWriteReactorBase : public grpc::ClientWriteReactor<Request> {
- grpc::Status status;
+ grpc::Status status = grpc::Status::OK;
bool done = false;
bool initialized = 0;
Request request;
@@ -53,14 +53,16 @@
template <class Request, class Response>
void ClientWriteReactorBase<Request, Response>::terminate(
const grpc::Status &status) {
- this->terminateCallback();
- if (this->done) {
- return;
+ if (this->status.ok()) {
+ this->status = status;
}
if (!this->status.ok()) {
std::cout << "error: " << this->status.error_message() << std::endl;
}
- this->status = status;
+ if (this->done) {
+ return;
+ }
+ this->terminateCallback();
this->done = true;
this->StartWritesDone();
}

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 7, 9:58 AM (21 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2253598
Default Alt Text
D3583.id11383.diff (4 KB)

Event Timeline