Raft logic fix: auto-discovery on AE request

This commit is contained in:
Pavel Kirienko 2015-05-24 21:14:59 +03:00
parent eb6102a9d4
commit 8c77793892
2 changed files with 29 additions and 19 deletions

View File

@ -89,22 +89,6 @@ private:
return NULL;
}
void addServer(NodeID node_id)
{
UAVCAN_ASSERT((num_known_servers_ + 1) < MaxClusterSize);
if (!isKnownServer(node_id) && node_id.isUnicast())
{
tracer_.onEvent(TraceRaftNewServerDiscovered, node_id.get());
servers_[num_known_servers_].node_id = node_id;
servers_[num_known_servers_].resetIndices(log_);
num_known_servers_ = static_cast<uint8_t>(num_known_servers_ + 1U);
}
else
{
UAVCAN_ASSERT(0);
}
}
virtual void handleTimerEvent(const TimerEvent&)
{
UAVCAN_ASSERT(num_known_servers_ < cluster_size_);
@ -301,6 +285,25 @@ public:
return 0;
}
/**
* Adds once server regardless of the discovery logic.
*/
void addServer(NodeID node_id)
{
UAVCAN_ASSERT((num_known_servers_ + 1) < MaxClusterSize);
if (!isKnownServer(node_id) && node_id.isUnicast())
{
tracer_.onEvent(TraceRaftNewServerDiscovered, node_id.get());
servers_[num_known_servers_].node_id = node_id;
servers_[num_known_servers_].resetIndices(log_);
num_known_servers_ = static_cast<uint8_t>(num_known_servers_ + 1U);
}
else
{
UAVCAN_ASSERT(0);
}
}
/**
* Whether such server has been discovered.
*/

View File

@ -457,9 +457,16 @@ private:
{
if (!cluster_.isKnownServer(request.getSrcNodeID()))
{
trace(TraceRaftRequestIgnored, request.getSrcNodeID().get());
response.setResponseEnabled(false);
return;
if (cluster_.isClusterDiscovered())
{
trace(TraceRaftRequestIgnored, request.getSrcNodeID().get());
response.setResponseEnabled(false);
return;
}
else
{
cluster_.addServer(request.getSrcNodeID());
}
}
UAVCAN_ASSERT(response.isResponseEnabled()); // This is default