Go to the documentation of this file.
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
102 msg.known_nodes.push_back(
getNode().getNodeID().
get());
107 msg.known_nodes.push_back(
servers_[i].node_id.get());
115 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
116 "Broadcasting Discovery message; known nodes: %d of %d",
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");
155 for (
uint8_t i = 0; i < msg.known_nodes.size(); i++)
162 const NodeID node_id(msg.known_nodes[i]);
172 if (msg.configured_cluster_size > msg.known_nodes.size())
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;
236 if ((init_cluster_size == 0) || (init_cluster_size >
MaxClusterSize))
238 return -ErrInvalidParam;
246 if ((res < 0) || (value != init_cluster_size))
248 UAVCAN_TRACE(
"dynamic_node_id_server::distributed::ClusterManager",
"Failed to store cluster size");
306 if (node_id ==
getNode().getNodeID())
343 return s->next_index;
383 return s->match_index;
394 s->match_index = match_index;
433 #endif // Include guard
uint8_t getClusterSize() const
bool isClusterDiscovered() const
void resetIndices(const Log &log)
Server servers_[MaxClusterSize - 1]
Minus one because the local server is not listed there.
virtual void handleTimerEvent(const TimerEvent &)
ClusterManager(INode &node, IStorageBackend &storage, const Log &log, IEventTracer &tracer)
void decrementServerNextIndex(NodeID server_node_id)
ROSCPP_DECL bool get(const std::string &key, bool &b)
MethodBinder< ClusterManager *, void(ClusterManager::*)(const ReceivedDataStructure< Discovery > &)> DiscoveryCallback
NodeID getRemoteServerNodeIDAtIndex(uint8_t index) const
TraceRaftNewServerDiscovered
Publisher< Discovery > discovery_pub_
static MonotonicDuration fromMSec(int64_t ms)
int setAndGetBack(const IStorageBackend::String &key, uint32_t &inout_value)
Log::Index getServerNextIndex(NodeID server_node_id) const
int get(const IStorageBackend::String &key, uint32_t &out_value) const
#define UAVCAN_TRACE(...)
bool isKnownServer(NodeID node_id) const
Server * findServer(NodeID node_id)
void incrementServerNextIndexBy(NodeID server_node_id, Log::Index increment)
Log::Index getServerMatchIndex(NodeID server_node_id) const
IStorageBackend & storage_
void startPeriodic(MonotonicDuration period)
virtual void registerInternalFailure(const char *msg)=0
static IStorageBackend::String getStorageKeyForClusterSize()
void resetAllServerIndices()
TraceRaftDiscoveryBroadcast
TraceRaftClusterSizeInited
const INode & getNode() const
virtual void onEvent(TraceCode event_code, int64_t event_argument)=0
TraceRaftBadClusterSizeReceived
Subscriber< Discovery, DiscoveryCallback > discovery_sub_
int init(const uint8_t init_cluster_size, const TransferPriority priority)
void setServerMatchIndex(NodeID server_node_id, Log::Index match_index)
const Server * findServer(NodeID node_id) const
int broadcast(const DataType &message)
uint8_t getQuorumSize() const
TraceRaftDiscoveryReceived
uint8_t getNumKnownServers() const
uint8_t num_known_servers_
NodeID getSrcNodeID() const
void startDiscoveryPublishingTimerIfNotRunning()
void handleDiscovery(const ReceivedDataStructure< Discovery > &msg)
void addServer(NodeID node_id)
Index getLastIndex() const