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 {