diff --git a/build/includes/summa_actor/summa_client.hpp b/build/includes/summa_actor/summa_client.hpp index a3225d36a816fe42504849e0bf3b1b0ec8785e1b..23ec9c7e33de8e55446b0e2cbdeb845a62a0a537 100644 --- a/build/includes/summa_actor/summa_client.hpp +++ b/build/includes/summa_actor/summa_client.hpp @@ -30,6 +30,7 @@ struct summa_client_state { std::vector<std::tuple<caf::actor, std::string>> backup_servers_list; Batch current_batch; + bool saved_batch = false; Summa_Actor_Settings summa_actor_settings; File_Access_Actor_Settings file_access_actor_settings; diff --git a/build/source/actors/summa_actor/summa_backup_server.cpp b/build/source/actors/summa_actor/summa_backup_server.cpp index 77380f30448a8ba5244fe165747d69625b513e7a..e3ec8a46cbfd92bb9bbab30e15b7a6f49e69bd27 100644 --- a/build/source/actors/summa_actor/summa_backup_server.cpp +++ b/build/source/actors/summa_actor/summa_backup_server.cpp @@ -116,6 +116,7 @@ behavior summa_backup_server(stateful_actor<summa_server_state>* self, const act // We have a new backup server that was added to the server [=](update_backup_server_list, std::vector<std::tuple<caf::actor, std::string>> backup_servers) { aout(self) << "Received the backup server list from the lead server\n"; + aout(self) << "Backup Server List = " << backup_servers << std::endl; self->state.backup_servers_list = backup_servers; }, diff --git a/build/source/actors/summa_actor/summa_client.cpp b/build/source/actors/summa_actor/summa_client.cpp index d11a81941320d4873296d076626fe9b388853a68..46d58af649c03be5043e1151648a71cab2e66028 100644 --- a/build/source/actors/summa_actor/summa_client.cpp +++ b/build/source/actors/summa_actor/summa_client.cpp @@ -32,7 +32,7 @@ behavior summa_client_init(stateful_actor<summa_client_state>* self) { behavior summa_client(stateful_actor<summa_client_state>* self) { - + self->state.running = true; self->send(self->state.current_server_actor, connect_to_server_v, self, self->state.hostname); return { @@ -66,6 +66,10 @@ behavior summa_client(stateful_actor<summa_client_state>* self) { if(actor_cast<actor>(server) == server_actor ) { aout(self) << "Found Match\n"; self->state.current_server = server; + if (self->state.saved_batch) { + self->state.saved_batch = false; + self->send(self->state.current_server_actor, done_batch_v, self, self->state.current_batch); + } } } self->state.servers.clear(); @@ -110,10 +114,10 @@ behavior summa_client(stateful_actor<summa_client_state>* self) { self->state.current_batch.updateWriteTime(write_time); if(self->state.current_server == nullptr) { - aout(self) << "Maybe We Should not Send this\n"; + aout(self) << "Saving batch until we find a new lead server\n"; + self->state.saved_batch = true; } else { self->send(self->state.current_server_actor, done_batch_v, self, self->state.current_batch); - } }, diff --git a/build/source/actors/summa_actor/summa_server.cpp b/build/source/actors/summa_actor/summa_server.cpp index 7cf9035d6f1c8d2e3f956177a91a249cbded94fd..cdd22009b2a5b48075997360b5460a781b6f87e2 100644 --- a/build/source/actors/summa_actor/summa_server.cpp +++ b/build/source/actors/summa_actor/summa_server.cpp @@ -54,7 +54,8 @@ behavior summa_server(stateful_actor<summa_server_state>* self) { std::optional<Client> client = self->state.client_container.getClient(client_actor.address()); if (client.has_value()) { aout(self) << "Client is already connected\n"; - aout(self) << "Checking if client has batch\n"; + aout(self) << "Updating " << hostname << " with current backup servers\n"; + self->send(client.value().getActor(), update_backup_server_list_v, self->state.backup_servers_list); std::optional<Batch> batch = client.value().getBatch(); if (batch.has_value()) { return; @@ -94,7 +95,16 @@ behavior summa_server(stateful_actor<summa_server_state>* self) { [=](connect_as_backup, actor backup_server, std::string hostname) { aout(self) << "Received Connection Request From a backup server " << hostname << "\n"; self->monitor(backup_server); - self->state.backup_servers_list.push_back(std::make_tuple(backup_server, hostname)); + // Check if the backup server is already connected + auto backup_server_iterator = find(self->state.backup_servers_list.begin(), self->state.backup_servers_list.end(), std::make_tuple(backup_server, hostname)); + + if (backup_server_iterator != self->state.backup_servers_list.end()) { + aout(self) << "Backup Server is already connected\n"; + } else { + aout(self) << "Adding Backup Server to list\n"; + self->state.backup_servers_list.push_back(std::make_tuple(backup_server, hostname)); + } + self->send(backup_server, connect_as_backup_v); // confirm connection with sender // Now we need to send the backup actor our current state self->send(backup_server, update_with_current_state_v, self->state.batch_container, self->state.client_container);