feat: memberlist optimization
This commit is contained in:
@@ -19,7 +19,7 @@ public:
|
||||
void updateAllNodeStatuses();
|
||||
void removeDeadNodes();
|
||||
void printMemberList();
|
||||
const std::map<String, NodeInfo>& getMemberList() const { return *ctx.memberList; }
|
||||
size_t getMemberCount() const { return ctx.memberList->getMemberCount(); }
|
||||
void updateLocalNodeResources(NodeInfo& node);
|
||||
void heartbeatTaskCallback();
|
||||
void updateAllMembersInfoTaskCallback();
|
||||
|
||||
133
include/spore/core/Memberlist.h
Normal file
133
include/spore/core/Memberlist.h
Normal file
@@ -0,0 +1,133 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <optional>
|
||||
#include <functional>
|
||||
#include "spore/types/NodeInfo.h"
|
||||
|
||||
/**
|
||||
* @brief Manages the list of cluster members.
|
||||
*
|
||||
* The Memberlist class maintains a collection of cluster members, where each member
|
||||
* is identified by its IP address and associated with a NodeInfo object. It provides
|
||||
* methods to add, update, and remove members, as well as handle node status changes
|
||||
* (stale and dead nodes).
|
||||
*/
|
||||
class Memberlist {
|
||||
public:
|
||||
/**
|
||||
* @brief Default constructor.
|
||||
*/
|
||||
Memberlist();
|
||||
|
||||
/**
|
||||
* @brief Destructor.
|
||||
*/
|
||||
~Memberlist();
|
||||
|
||||
/**
|
||||
* @brief Adds or updates a member in the list.
|
||||
*
|
||||
* If the member already exists, updates its information. Otherwise, adds a new member.
|
||||
* @param ip The IP address of the member (as string).
|
||||
* @param node The NodeInfo object containing member details.
|
||||
* @return True if the member was added or updated, false otherwise.
|
||||
*/
|
||||
bool addOrUpdateMember(const std::string& ip, const NodeInfo& node);
|
||||
|
||||
/**
|
||||
* @brief Adds a new member to the list.
|
||||
*
|
||||
* @param ip The IP address of the member (as string).
|
||||
* @param node The NodeInfo object containing member details.
|
||||
* @return True if the member was added, false if it already exists.
|
||||
*/
|
||||
bool addMember(const std::string& ip, const NodeInfo& node);
|
||||
|
||||
/**
|
||||
* @brief Updates an existing member in the list.
|
||||
*
|
||||
* @param ip The IP address of the member (as string).
|
||||
* @param node The updated NodeInfo object.
|
||||
* @return True if the member was updated, false if it doesn't exist.
|
||||
*/
|
||||
bool updateMember(const std::string& ip, const NodeInfo& node);
|
||||
|
||||
/**
|
||||
* @brief Removes a member from the list.
|
||||
*
|
||||
* @param ip The IP address of the member to remove (as string).
|
||||
* @return True if the member was removed, false if it doesn't exist.
|
||||
*/
|
||||
bool removeMember(const std::string& ip);
|
||||
|
||||
/**
|
||||
* @brief Retrieves a member by IP address.
|
||||
*
|
||||
* @param ip The IP address of the member (as string).
|
||||
* @return Optional containing the NodeInfo if found, or std::nullopt if not found.
|
||||
*/
|
||||
std::optional<NodeInfo> getMember(const std::string& ip) const;
|
||||
|
||||
/**
|
||||
* @brief Iterates over all members and calls the provided callback for each.
|
||||
*
|
||||
* @param callback Function to call for each member. Receives (ip, node) as parameters.
|
||||
*/
|
||||
void forEachMember(std::function<void(const std::string&, const NodeInfo&)> callback) const;
|
||||
|
||||
/**
|
||||
* @brief Iterates over all members and calls the provided callback for each.
|
||||
*
|
||||
* @param callback Function to call for each member. Receives (ip, node) as parameters.
|
||||
* If callback returns false, iteration stops.
|
||||
* @return True if all members were processed, false if iteration was stopped early.
|
||||
*/
|
||||
bool forEachMemberUntil(std::function<bool(const std::string&, const NodeInfo&)> callback) const;
|
||||
|
||||
/**
|
||||
* @brief Gets the number of members in the list.
|
||||
*
|
||||
* @return The number of members.
|
||||
*/
|
||||
size_t getMemberCount() const;
|
||||
|
||||
/**
|
||||
* @brief Updates the status of all members based on current time and thresholds.
|
||||
*
|
||||
* Marks nodes as stale or dead based on their last seen time.
|
||||
* @param currentTime The current time in milliseconds.
|
||||
* @param staleThresholdMs Threshold for marking a node as stale (milliseconds).
|
||||
* @param deadThresholdMs Threshold for marking a node as dead (milliseconds).
|
||||
* @param onStatusChange Optional callback fired when a node's status changes.
|
||||
*/
|
||||
void updateAllNodeStatuses(unsigned long currentTime,
|
||||
unsigned long staleThresholdMs,
|
||||
unsigned long deadThresholdMs,
|
||||
std::function<void(const std::string&, NodeInfo::Status, NodeInfo::Status)> onStatusChange = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Removes all dead members from the list.
|
||||
*
|
||||
* @return The number of members removed.
|
||||
*/
|
||||
size_t removeDeadMembers();
|
||||
|
||||
/**
|
||||
* @brief Checks if a member exists in the list.
|
||||
*
|
||||
* @param ip The IP address of the member (as string).
|
||||
* @return True if the member exists, false otherwise.
|
||||
*/
|
||||
bool hasMember(const std::string& ip) const;
|
||||
|
||||
/**
|
||||
* @brief Clears all members from the list.
|
||||
*/
|
||||
void clear();
|
||||
|
||||
private:
|
||||
std::map<std::string, NodeInfo> m_members; ///< Internal map holding the members.
|
||||
};
|
||||
@@ -2,12 +2,14 @@
|
||||
|
||||
#include <WiFiUdp.h>
|
||||
#include <map>
|
||||
#include "spore/types/NodeInfo.h"
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <initializer_list>
|
||||
#include <memory>
|
||||
#include "spore/types/NodeInfo.h"
|
||||
#include "spore/types/Config.h"
|
||||
#include "spore/types/ApiTypes.h"
|
||||
#include "spore/core/Memberlist.h"
|
||||
|
||||
class NodeContext {
|
||||
public:
|
||||
@@ -18,7 +20,7 @@ public:
|
||||
String hostname;
|
||||
IPAddress localIP;
|
||||
NodeInfo self;
|
||||
std::map<String, NodeInfo>* memberList;
|
||||
std::unique_ptr<Memberlist> memberList;
|
||||
::Config config;
|
||||
std::map<String, String> constructorLabels; // Labels passed to constructor (not persisted)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user