diff --git a/build/includes/summa_actor/client.hpp b/build/includes/summa_actor/client.hpp index 68d6f6cadaba943e11f1461607b5b06ae67ca75f..3da062d621384d4eefb1401c69b0a900a570d554 100644 --- a/build/includes/summa_actor/client.hpp +++ b/build/includes/summa_actor/client.hpp @@ -13,26 +13,76 @@ class Client { caf::actor client_actor; std::string hostname; int current_batch_id; + int lost_Potential_indicator; // value to indicate the Potential that a client is lost. + // The greater the lost_Potential_indicator the greater chances the client has been lost. public: + /** + * @brief Construct a new Client object + * + * @param id + * @param client_actor + * @param hostname + */ Client(int id, caf::actor client_actor, std::string hostname); - void updateCurrentBatchID(int batch_id); - + // Getters + /** + * @brief Returns the actor_reference of the client + */ caf::actor getActor(); + /** + * @brief Get the value of the lost_Potential_indicator variable. + * @return int + */ + int getLostPotentialIndicator(); + /** + * @brief Returns the ID of the client + */ int getID(); + /** + * @brief Get the Hostname of the client + */ std::string getHostname(); + // Setters + /** + * @brief Sets the batch_id of the batch the client is currently computing + */ + void updateCurrentBatchID(int batch_id); + + // methods + /** + * @brief Increments the lost_likley_hood indicator variable + * this is done everytime a client is sent a heartbeat message + * + * checks if the client is likely lost or not + */ + void incrementLostPotential(); + + /** + * @brief Decrement the lost_likley_hood indicator variables + * this is done everytime a client sends a heartbeat message back + * to the server + */ + void decrementLostPotential(); + }; +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// class Client_Container { private: int num_clients = 0; - + int lost_client_threshold = 3; // value to determine if client is lost std::vector<Client> client_list; @@ -42,31 +92,14 @@ class Client_Container { */ Client_Container(); - /** - * @brief add a client to the client vector - * increment the number of clients - * - * @param client_actor connecting cleint actor_ref - * @param hostname name of the host that client actor is connecting - * from - */ - void addClient(caf::actor client_actor, std::string hostname); - - /** - * @brief Update the current batch id the client is working on - * - * @param client_id The id of the client we want to update the batch for - * @param batch_id The id of the batch - */ - void updateCurrentBatch(int client_id, int batch_id); - + // Getters /** * @brief Get the number of connected clients * * @return int */ int getNumClients(); - + /** * @brief Get the Client ID of a cleint from its actor ref * @@ -74,7 +107,7 @@ class Client_Container { * @return int */ int getClientID(caf::actor client_actor); - + /** * @brief Get a client from the client list * This is used when we need to get all of the @@ -85,6 +118,38 @@ class Client_Container { */ Client getClient(int index); + // Methods + /** + * @brief add a client to the client vector + * increment the number of clients + * + * @param client_actor connecting cleint actor_ref + * @param hostname name of the host that client actor is connecting + * from + */ + void addClient(caf::actor client_actor, std::string hostname); + + /** + * @brief Update the current batch id the client is working on + * + * @param client_id The id of the client we want to update the batch for + * @param batch_id The id of the batch + */ + void updateCurrentBatch(int client_id, int batch_id); + + /** + * @brief Increments the lost_potential indicator variable + * this is done everytime a client is sent a heartbeat message + */ + bool checkForLostClient(int index); + + /** + * @brief Decrement the lost_likley_hood indicator variables + * this is done everytime a client sends a heartbeat message back + * to the server + */ + void decrementLostPotential(int client_id); + /** * @brief Removes a client from the back of the list * Used when we are finished and want to pop the clients @@ -109,4 +174,11 @@ class Client_Container { */ bool isEmpty(); + /** + * @brief Find the index of a client in the client_list + * + * @param client_id + * @return int + */ + int findClientByID(int client_id); }; \ No newline at end of file diff --git a/build/source/actors/summa_actor/client.cpp b/build/source/actors/summa_actor/client.cpp index 220676dd1e16afd0191ee6c8279426fac1b2d534..52c36531129f68af6e34ce896de139079c85a70b 100644 --- a/build/source/actors/summa_actor/client.cpp +++ b/build/source/actors/summa_actor/client.cpp @@ -9,13 +9,13 @@ Client::Client(int id, caf::actor client_actor, std::string hostname) { this->connected = true; } - +// Getters caf::actor Client::getActor() { return this->client_actor; } -void Client::updateCurrentBatchID(int batch_id) { - this->current_batch_id = batch_id; +int Client::getLostPotentialIndicator() { + return this->lost_Potential_indicator; } int Client::getID() { @@ -26,6 +26,26 @@ std::string Client::getHostname() { return this->hostname; } +// Setters +void Client::updateCurrentBatchID(int batch_id) { + this->current_batch_id = batch_id; +} + +// Methods +void Client::incrementLostPotential() { + this->lost_Potential_indicator++; +} + +void Client::decrementLostPotential() { + this->lost_Potential_indicator--; +} + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// Client_Container::Client_Container() {} @@ -51,6 +71,21 @@ Client Client_Container::getClient(int index) { return this->client_list[index]; } +// Needs to be used direclty after getClient so same index is used +bool Client_Container::checkForLostClient(int index) { + this->client_list[index].incrementLostPotential(); + if (this->lost_client_threshold < this->client_list[index].getLostPotentialIndicator()) { + return true; + } else { + return false; + } +} + +void Client_Container::decrementLostPotential(int client_id) { + int index = findClientByID(client_id); + this->client_list[index].decrementLostPotential(); +} + int Client_Container::getClientID(caf::actor client_actor) { for (int i = 0; i < num_clients; i++) { @@ -76,12 +111,21 @@ Client Client_Container::removeClient_fromBack() { } void Client_Container::updateCurrentBatch(int client_id, int batch_id) { - for (int i = 0; i < num_clients; i++) { + int index = findClientByID(client_id); + this->client_list[index].updateCurrentBatchID(batch_id);; +} + +int Client_Container::findClientByID(int client_id) { + for(int i = 0; i < this->num_clients; i++) { if (client_id == this->client_list[i].getID()){ - this->client_list[i].updateCurrentBatchID(batch_id); + return i; } } + throw "Cannot Find Client"; } + + + diff --git a/build/source/actors/summa_actor/summa_server.cpp b/build/source/actors/summa_actor/summa_server.cpp index b30a03be550c809353c370fef1c4d68db97885fa..e526d112ecfae629ac01e7399603a275cb80d767 100644 --- a/build/source/actors/summa_actor/summa_server.cpp +++ b/build/source/actors/summa_actor/summa_server.cpp @@ -108,7 +108,12 @@ behavior summa_server(stateful_actor<summa_server_state>* self, Distributed_Sett [=](check_on_clients) { for (int i = 0; i < self->state.client_container->getNumClients(); i++) { Client client = self->state.client_container->getClient(i); - self->send(client.getActor(), heartbeat_v); + if(self->state.client_container->checkForLostClient(i)) { + // Client May Be Lost + aout(self) << "Client " << client.getID() << " is considered lost\n"; + } else { + self->send(client.getActor(), heartbeat_v); + } } self->send(self->state.health_check_reminder_actor, start_health_check_v, self, self->state.heartbeat_interval); @@ -116,7 +121,7 @@ behavior summa_server(stateful_actor<summa_server_state>* self, Distributed_Sett [=](heartbeat, int client_id) { aout(self) << "Received HeartBeat From: " << client_id << "\n"; - + self->state.client_container->decrementLostPotential(client_id); }, }; }