Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F2906792
D3583.id11383.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
D3583.id11383.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D3583: [services] Backup - fix handling reading done in client reactors
Attached
Detach File
Event Timeline
Log In to Comment