From 738c8af060013638a30d06466f57dbf36051a805 Mon Sep 17 00:00:00 2001
From: KyleKlenk <kyle.c.klenk@gmail.com>
Date: Wed, 16 Nov 2022 14:44:26 -0600
Subject: [PATCH] clients and backup servers can be updated of new backup
 servers

---
 build/includes/global/message_atoms.hpp                 | 6 +++++-
 build/includes/summa_actor/summa_client.hpp             | 2 +-
 build/source/actors/summa_actor/summa_backup_server.cpp | 7 ++++++-
 build/source/actors/summa_actor/summa_client.cpp        | 6 +++++-
 build/source/actors/summa_actor/summa_server.cpp        | 8 ++++++++
 5 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/build/includes/global/message_atoms.hpp b/build/includes/global/message_atoms.hpp
index 5854774..260aa7c 100644
--- a/build/includes/global/message_atoms.hpp
+++ b/build/includes/global/message_atoms.hpp
@@ -128,6 +128,10 @@ CAF_BEGIN_TYPE_ID_BLOCK(summa, first_custom_type_id)
     // Reciever:
     // Summary:
     CAF_ADD_ATOM(summa, no_more_batches)
+    // Sender:
+    // Reciever:
+    // Summary:
+    CAF_ADD_ATOM(summa, update_backup_server_list)
     // Struct Types
     CAF_ADD_TYPE_ID(summa, (Distributed_Settings))
     CAF_ADD_TYPE_ID(summa, (Summa_Actor_Settings))
@@ -141,12 +145,12 @@ CAF_BEGIN_TYPE_ID_BLOCK(summa, first_custom_type_id)
     CAF_ADD_TYPE_ID(summa, (Batch))
     CAF_ADD_TYPE_ID(summa, (Batch_Container))
 
-
     CAF_ADD_TYPE_ID(summa, (std::vector<std::vector<double>>))
     CAF_ADD_TYPE_ID(summa, (std::vector<std::vector<int>>))
     CAF_ADD_TYPE_ID(summa, (std::vector<int>))
     CAF_ADD_TYPE_ID(summa, (std::vector<double>))
     CAF_ADD_TYPE_ID(summa, (std::vector<long int>))
+    CAF_ADD_TYPE_ID(summa, (std::vector<std::tuple<caf::actor, std::string>>))
 
 
 CAF_END_TYPE_ID_BLOCK(summa)
\ No newline at end of file
diff --git a/build/includes/summa_actor/summa_client.hpp b/build/includes/summa_actor/summa_client.hpp
index 308c0ad..4e5dfa5 100644
--- a/build/includes/summa_actor/summa_client.hpp
+++ b/build/includes/summa_actor/summa_client.hpp
@@ -22,7 +22,7 @@ struct summa_client_state {
     int client_id; // id held by server
 
     // tuple is the actor ref and hostname of the backup server
-    std::vector<std::tuple<caf::actor, std::string>> backup_servers;
+    std::vector<std::tuple<caf::actor, std::string>> backup_servers_list;
 
     Batch current_batch;
 
diff --git a/build/source/actors/summa_actor/summa_backup_server.cpp b/build/source/actors/summa_actor/summa_backup_server.cpp
index 5fc7071..caa7470 100644
--- a/build/source/actors/summa_actor/summa_backup_server.cpp
+++ b/build/source/actors/summa_actor/summa_backup_server.cpp
@@ -80,12 +80,18 @@ behavior summa_backup_server(stateful_actor<summa_server_state>* self, const act
             aout(self) << "We are now connected to the lead server\n";
         },
 
+        // get the list of batches and clients from the lead server
         [=](update_with_current_state, Batch_Container& batch_container, Client_Container& client_container) {
             aout(self) << "Received the containers from the lead server\n";
             self->state.batch_container = &batch_container;
             self->state.client_container = &client_container;
         },
 
+        [=](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";
+            self->state.backup_servers_list = backup_servers;
+        },
+
         // Client finished a batch and the lead server has sent an update
         [=](done_batch, actor client_actor, Batch& batch) {
             aout(self) << "Batch: " << batch.getBatchID() << " is done\n";
@@ -103,7 +109,6 @@ behavior summa_backup_server(stateful_actor<summa_server_state>* self, const act
         [=](no_more_batches, actor client_actor) {
             aout(self) << "No more batches to distribute\n";
             self->state.client_container->setBatchForClient(client_actor, {});
-
         },
 
         // Simulation has finished
diff --git a/build/source/actors/summa_actor/summa_client.cpp b/build/source/actors/summa_actor/summa_client.cpp
index ae642e6..34ef667 100644
--- a/build/source/actors/summa_actor/summa_client.cpp
+++ b/build/source/actors/summa_actor/summa_client.cpp
@@ -69,6 +69,11 @@ behavior summa_client(stateful_actor<summa_client_state>* self, const actor& ser
             
         },
 
+        [=](update_backup_server_list, std::vector<std::tuple<caf::actor, std::string>> backup_servers) {
+            aout(self) << "Received the backup server list from the server\n";
+            self->state.backup_servers_list = backup_servers;
+        },
+
         // Received batch from server to compute
         [=](Batch& batch) {
             self->state.current_batch = batch;
@@ -104,7 +109,6 @@ behavior summa_client(stateful_actor<summa_client_state>* self, const actor& ser
                 self->send(server_actor, done_batch_v, self, self->state.current_batch);
 
             }
-
         },
 
         [=](time_to_exit) {
diff --git a/build/source/actors/summa_actor/summa_server.cpp b/build/source/actors/summa_actor/summa_server.cpp
index c857643..2c9d0a2 100644
--- a/build/source/actors/summa_actor/summa_server.cpp
+++ b/build/source/actors/summa_actor/summa_server.cpp
@@ -77,6 +77,14 @@ behavior summa_server(stateful_actor<summa_server_state>* self) {
             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);
+            std::vector<Client> clients = self->state.client_container->getClientList();
+            for (Client client : clients) {
+                self->send(client.getActor(), update_backup_server_list_v, self->state.backup_servers_list);
+            }
+            
+            for(std::tuple<actor, std::string> backup_server : self->state.backup_servers_list) {
+                self->send(std::get<0>(backup_server), update_backup_server_list_v, self->state.backup_servers_list);
+            }
 
         }, 
 
-- 
GitLab