Page MenuHomePhabricator

D3513.id10746.diff
No OneTemporary

D3513.id10746.diff

diff --git a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h
deleted file mode 100644
--- a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-
-#include <grpcpp/grpcpp.h>
-#include <iostream>
-#include <memory>
-#include <string>
-
-namespace comm {
-namespace network {
-
-template <class Request, class Response>
-class WriteReactorBase : public grpc::ServerWriteReactor<Response> {
- Response response;
-
-protected:
- // this is a const ref since it's not meant to be modified
- const Request &request;
-
-public:
- WriteReactorBase(const Request *request);
-
- virtual void NextWrite();
- void OnDone() override;
- void OnWriteDone(bool ok) override;
-
- virtual std::unique_ptr<grpc::Status> writeResponse(Response *response) = 0;
-};
-
-template <class Request, class Response>
-WriteReactorBase<Request, Response>::WriteReactorBase(const Request *request)
- : request(*request) {
- // we cannot call this->NextWrite() here because it's going to call it on
- // the base class, not derived leading to the runtime error of calling
- // a pure virtual function
- // NextWrite has to be exposed as a public function and called explicitly
- // to initialize writing
-}
-
-template <class Request, class Response>
-void WriteReactorBase<Request, Response>::NextWrite() {
- this->response = Response();
- std::unique_ptr<grpc::Status> status = this->writeResponse(&this->response);
- if (status != nullptr) {
- this->Finish(*status);
- return;
- }
- this->StartWrite(&this->response);
-}
-
-template <class Request, class Response>
-void WriteReactorBase<Request, Response>::OnDone() {
- delete this;
-}
-
-template <class Request, class Response>
-void WriteReactorBase<Request, Response>::OnWriteDone(bool ok) {
- if (!ok) {
- this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, "writing error"));
- return;
- }
- try {
- this->NextWrite();
- } catch (std::runtime_error &e) {
- this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, e.what()));
- }
-}
-
-} // namespace network
-} // namespace comm
diff --git a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h
new file mode 100644
--- /dev/null
+++ b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h
@@ -0,0 +1,90 @@
+#pragma once
+
+#include <grpcpp/grpcpp.h>
+
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace comm {
+namespace network {
+namespace reactor {
+
+template <class Request, class Response>
+class ServerWriteReactorBase : public grpc::ServerWriteReactor<Response> {
+ Response response;
+ bool initialized = false;
+
+ void terminate(grpc::Status status);
+
+protected:
+ // this is a const ref since it's not meant to be modified
+ const Request &request;
+
+public:
+ ServerWriteReactorBase(const Request *request);
+
+ virtual void NextWrite();
+ void OnDone() override;
+ void OnWriteDone(bool ok) override;
+
+ virtual std::unique_ptr<grpc::Status> writeResponse(Response *response) = 0;
+ virtual void initialize(){};
+ virtual void doneCallback(){};
+};
+
+template <class Request, class Response>
+void ServerWriteReactorBase<Request, Response>::terminate(grpc::Status status) {
+ this->status = status;
+ this->Finish(status);
+}
+
+template <class Request, class Response>
+ServerWriteReactorBase<Request, Response>::ServerWriteReactorBase(
+ const Request *request)
+ : request(*request) {
+ // we cannot call this->NextWrite() here because it's going to call it on
+ // the base class, not derived leading to the runtime error of calling
+ // a pure virtual function
+ // NextWrite has to be exposed as a public function and called explicitly
+ // to initialize writing
+}
+
+template <class Request, class Response>
+void ServerWriteReactorBase<Request, Response>::NextWrite() {
+ try {
+ if (!this->initialized) {
+ this->initialize();
+ this->initialized = true;
+ }
+ this->response = Response();
+ std::unique_ptr<grpc::Status> status = this->writeResponse(&this->response);
+ if (status != nullptr) {
+ this->terminate(*status);
+ return;
+ }
+ this->StartWrite(&this->response);
+ } catch (std::runtime_error &e) {
+ std::cout << "error: " << e.what() << std::endl;
+ this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, e.what()));
+ }
+}
+
+template <class Request, class Response>
+void ServerWriteReactorBase<Request, Response>::OnDone() {
+ this->doneCallback();
+ delete this;
+}
+
+template <class Request, class Response>
+void ServerWriteReactorBase<Request, Response>::OnWriteDone(bool ok) {
+ if (!ok) {
+ this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, "writing error"));
+ return;
+ }
+ this->NextWrite();
+}
+
+} // namespace reactor
+} // namespace network
+} // namespace comm

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 7, 9:40 AM (21 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2253341
Default Alt Text
D3513.id10746.diff (5 KB)

Event Timeline