mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-14 05:53:33 +08:00
dynamic_node_id_server::distributed::StateReport structure
This commit is contained in:
@@ -74,6 +74,15 @@ public:
|
||||
*/
|
||||
class RaftCore : private TimerBase
|
||||
{
|
||||
public:
|
||||
enum ServerState
|
||||
{
|
||||
ServerStateFollower,
|
||||
ServerStateCandidate,
|
||||
ServerStateLeader
|
||||
};
|
||||
|
||||
private:
|
||||
typedef MethodBinder<RaftCore*, void (RaftCore::*)(const ReceivedDataStructure<AppendEntries::Request>&,
|
||||
ServiceResponseDataStructure<AppendEntries::Response>&)>
|
||||
AppendEntriesCallback;
|
||||
@@ -88,13 +97,6 @@ class RaftCore : private TimerBase
|
||||
typedef MethodBinder<RaftCore*, void (RaftCore::*)(const ServiceCallResult<RequestVote>&)>
|
||||
RequestVoteResponseCallback;
|
||||
|
||||
enum ServerState
|
||||
{
|
||||
ServerStateFollower,
|
||||
ServerStateCandidate,
|
||||
ServerStateLeader
|
||||
};
|
||||
|
||||
struct PendingAppendEntriesFields
|
||||
{
|
||||
Log::Index prev_log_index;
|
||||
@@ -895,6 +897,15 @@ public:
|
||||
// Remember that index zero contains a special-purpose entry that doesn't count as allocation
|
||||
return persistent_state_.getLog().getLastIndex();
|
||||
}
|
||||
|
||||
/**
|
||||
* These accessors are needed for debugging, visualization and testing.
|
||||
*/
|
||||
const PersistentState& getPersistentState() const { return persistent_state_; }
|
||||
const ClusterManager& getClusterManager() const { return cluster_; }
|
||||
MonotonicTime getLastActivityTimestamp() const { return last_activity_timestamp_; }
|
||||
bool isInActiveMode() const { return active_mode_; }
|
||||
ServerState getServerState() const { return server_state_; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -295,6 +295,68 @@ public:
|
||||
}
|
||||
|
||||
Log::Index getNumAllocations() const { return raft_core_.getNumAllocations(); }
|
||||
|
||||
/**
|
||||
* These accessors are needed for debugging, visualization and testing.
|
||||
*/
|
||||
const RaftCore& getRaftCore() const { return raft_core_; }
|
||||
const NodeDiscoverer& getNodeDiscoverer() const { return node_discoverer_; }
|
||||
};
|
||||
|
||||
/**
|
||||
* This structure represents immediate state of the server.
|
||||
* It can be used for state visualization and debugging.
|
||||
*/
|
||||
struct StateReport
|
||||
{
|
||||
uint8_t cluster_size;
|
||||
|
||||
RaftCore::ServerState state;
|
||||
bool is_active;
|
||||
|
||||
Log::Index last_log_index;
|
||||
Log::Index commit_index;
|
||||
|
||||
Term last_log_term;
|
||||
Term current_term;
|
||||
|
||||
NodeID voted_for;
|
||||
|
||||
MonotonicTime last_activity_timestamp;
|
||||
|
||||
uint8_t num_unknown_nodes;
|
||||
|
||||
struct FollowerState
|
||||
{
|
||||
NodeID node_id;
|
||||
Log::Index next_index;
|
||||
Log::Index match_index;
|
||||
|
||||
FollowerState()
|
||||
: next_index(0)
|
||||
, match_index(0)
|
||||
{ }
|
||||
} followers[ClusterManager::MaxClusterSize - 1];
|
||||
|
||||
StateReport(const Server& s)
|
||||
: cluster_size (s.getRaftCore().getClusterManager().getClusterSize())
|
||||
, state (s.getRaftCore().getServerState())
|
||||
, is_active (s.getRaftCore().isInActiveMode())
|
||||
, last_log_index (s.getRaftCore().getPersistentState().getLog().getLastIndex())
|
||||
, commit_index (s.getRaftCore().getCommitIndex())
|
||||
, last_log_term (0) // See below
|
||||
, current_term (s.getRaftCore().getPersistentState().getCurrentTerm())
|
||||
, voted_for (s.getRaftCore().getPersistentState().getVotedFor())
|
||||
, last_activity_timestamp(s.getRaftCore().getLastActivityTimestamp())
|
||||
, num_unknown_nodes (s.getNodeDiscoverer().getNumUnknownNodes())
|
||||
{
|
||||
const Entry* const e = s.getRaftCore().getPersistentState().getLog().getEntryAtIndex(last_log_index);
|
||||
UAVCAN_ASSERT(e != NULL);
|
||||
if (e != NULL)
|
||||
{
|
||||
last_log_term = e->term;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -361,6 +361,12 @@ public:
|
||||
* Returns true if there's at least one node with pending GetNodeInfo.
|
||||
*/
|
||||
bool hasUnknownNodes() const { return !node_map_.isEmpty(); }
|
||||
|
||||
/**
|
||||
* Returns number of nodes that are being queried at the moment.
|
||||
* This method is needed for testing and state visualization.
|
||||
*/
|
||||
uint8_t getNumUnknownNodes() const { return static_cast<uint8_t>(node_map_.getSize()); }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user