diff --git a/dsdl/uavcan/protocol/dynamic_node_id/server/220.AppendEntries.uavcan b/dsdl/uavcan/protocol/dynamic_node_id/server/220.AppendEntries.uavcan index 329bfff8e6..30a966eb78 100644 --- a/dsdl/uavcan/protocol/dynamic_node_id/server/220.AppendEntries.uavcan +++ b/dsdl/uavcan/protocol/dynamic_node_id/server/220.AppendEntries.uavcan @@ -4,11 +4,14 @@ # # -# Given min election timeout and cluster size, the maximum request interval can be derived as follows: -# max request interval = (min election timeout) / 2 requests / (cluster size - 1) -# Obviously, request interval can be lower than that if needed, but not higher. +# Given min election timeout and cluster size, the maximum recommended request interval can be derived as follows: +# max recommended request interval = (min election timeout) / 2 requests / (cluster size - 1) +# The equation assumes that the Leader requests one Follower at a time, so that there's at most one pending call +# at any moment. Such behavior is optimal as it creates uniform bus load, but it is actually implementation-specific. +# Obviously, request interval can be lower than that if needed, but higher values are not recommended as they may +# cause Followers to initiate premature elections in case of intensive frame losses or delays. # -# Real timeout is randomized in the range (MIN, MAX]. +# Real timeout is randomized in the range (MIN, MAX], according to the Raft paper. # uint16 DEFAULT_MIN_ELECTION_TIMEOUT_MS = 4000 uint16 DEFAULT_MAX_ELECTION_TIMEOUT_MS = 6000 @@ -19,8 +22,8 @@ uint8 prev_log_index uint8 leader_commit # -# Worst-case replication time can be computed as: -# worst replication time = (127 log entries) * (2 trips of next_index) * (cluster size - 1) * (request interval) +# Worst-case replication time per Follower can be computed as: +# worst replication time = (127 log entries) * (2 trips of next_index) * (request interval per Follower) # Entry[<=1] entries