5 #ifndef UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_DISTRIBUTED_CLUSTER_MANAGER_HPP_INCLUDED 6 #define UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_DISTRIBUTED_CLUSTER_MANAGER_HPP_INCLUDED 19 #include <uavcan/protocol/dynamic_node_id/server/Discovery.hpp> 23 namespace dynamic_node_id_server
37 void (ClusterManager::*)
82 if (servers_[i].node_id == node_id)
102 msg.known_nodes.push_back(
getNode().getNodeID().
get());
107 msg.known_nodes.push_back(servers_[i].
node_id.
get());
110 UAVCAN_ASSERT(msg.known_nodes.size() == (num_known_servers_ + 1));
115 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
116 "Broadcasting Discovery message; known nodes: %d of %d",
117 int(msg.known_nodes.size()),
int(cluster_size_));
119 const int res = discovery_pub_.
broadcast(msg);
122 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
"Discovery broadcst failed: %d", res);
131 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
132 "Discovery broadcasting timer stopped");
145 if (msg.configured_cluster_size != cluster_size_)
155 for (
uint8_t i = 0; i < msg.known_nodes.size(); i++)
172 if (msg.configured_cluster_size > msg.known_nodes.size())
199 , discovery_sub_(node)
200 , discovery_pub_(node)
202 , num_known_servers_(0)
223 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
224 "Cluster size is neither configured nor stored in the storage");
229 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
"Cluster size is invalid");
230 return -ErrInvalidConfiguration;
232 cluster_size_ =
static_cast<uint8_t>(value);
236 if ((init_cluster_size == 0) || (init_cluster_size >
MaxClusterSize))
238 return -ErrInvalidParam;
240 cluster_size_ = init_cluster_size;
246 if ((res < 0) || (value != init_cluster_size))
248 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
"Failed to store cluster size");
261 int res = discovery_pub_.
init(priority);
293 num_known_servers_ =
static_cast<uint8_t>(num_known_servers_ + 1U);
306 if (node_id ==
getNode().getNodeID())
314 if (servers_[i].node_id == node_id)
328 if (index < num_known_servers_)
330 return servers_[index].
node_id;
433 #endif // Include guard
TraceRaftDiscoveryReceived
ClusterManager(INode &node, IStorageBackend &storage, const Log &log, IEventTracer &tracer)
NodeID getSrcNodeID() const
void startPeriodic(MonotonicDuration period)
static IStorageBackend::String getStorageKeyForClusterSize()
void resetAllServerIndices()
uint8_t getClusterSize() const
uint8_t getNumKnownServers() const
void startDiscoveryPublishingTimerIfNotRunning()
void decrementServerNextIndex(NodeID server_node_id)
uint8_t num_known_servers_
IStorageBackend & storage_
MethodBinder< ClusterManager *, void(ClusterManager::*)(const ReceivedDataStructure< Discovery > &)> DiscoveryCallback
virtual void onEvent(TraceCode event_code, int64_t event_argument)=0
#define UAVCAN_TRACE(...)
void incrementServerNextIndexBy(NodeID server_node_id, Log::Index increment)
uint8_t getQuorumSize() const
Subscriber< Discovery, DiscoveryCallback > discovery_sub_
int init(const uint8_t init_cluster_size, const TransferPriority priority)
Log::Index getServerNextIndex(NodeID server_node_id) const
virtual void handleTimerEvent(const TimerEvent &)
int get(const IStorageBackend::String &key, uint32_t &out_value) const
void resetIndices(const Log &log)
TraceRaftNewServerDiscovered
Server * findServer(NodeID node_id)
virtual void registerInternalFailure(const char *msg)=0
int setAndGetBack(const IStorageBackend::String &key, uint32_t &inout_value)
TraceRaftClusterSizeInited
bool isKnownServer(NodeID node_id) const
void setServerMatchIndex(NodeID server_node_id, Log::Index match_index)
const Server * findServer(NodeID node_id) const
TraceRaftBadClusterSizeReceived
int start(const Callback &callback)
Publisher< Discovery > discovery_pub_
NodeID getRemoteServerNodeIDAtIndex(uint8_t index) const
const INode & getNode() const
Server servers_[MaxClusterSize - 1]
Minus one because the local server is not listed there.
Index getLastIndex() const
static MonotonicDuration fromMSec(int64_t ms)
bool isClusterDiscovered() const
void addServer(NodeID node_id)
Log::Index getServerMatchIndex(NodeID server_node_id) const
TraceRaftDiscoveryBroadcast
int broadcast(const DataType &message)
void handleDiscovery(const ReceivedDataStructure< Discovery > &msg)