mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-24 20:53:34 +08:00
Fixed RaftCore API
This commit is contained in:
@@ -13,6 +13,7 @@
|
|||||||
#include <uavcan/node/service_client.hpp>
|
#include <uavcan/node/service_client.hpp>
|
||||||
#include <uavcan/node/timer.hpp>
|
#include <uavcan/node/timer.hpp>
|
||||||
#include <uavcan/util/method_binder.hpp>
|
#include <uavcan/util/method_binder.hpp>
|
||||||
|
#include <uavcan/util/lazy_constructor.hpp>
|
||||||
#include <uavcan/util/map.hpp>
|
#include <uavcan/util/map.hpp>
|
||||||
// Types used by the server
|
// Types used by the server
|
||||||
#include <uavcan/protocol/dynamic_node_id/server/AppendEntries.hpp>
|
#include <uavcan/protocol/dynamic_node_id/server/AppendEntries.hpp>
|
||||||
@@ -384,16 +385,31 @@ public:
|
|||||||
*/
|
*/
|
||||||
void appendLog(const protocol::dynamic_node_id::server::Entry& entry);
|
void appendLog(const protocol::dynamic_node_id::server::Entry& entry);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used to perform log searches.
|
||||||
|
*/
|
||||||
|
struct LogEntryInfo
|
||||||
|
{
|
||||||
|
protocol::dynamic_node_id::server::Entry entry;
|
||||||
|
bool committed;
|
||||||
|
|
||||||
|
LogEntryInfo(const protocol::dynamic_node_id::server::Entry& arg_entry, bool arg_committed)
|
||||||
|
: entry(arg_entry)
|
||||||
|
, committed(arg_committed)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is used by the allocator to query existence of certain entries in the Raft log.
|
* This method is used by the allocator to query existence of certain entries in the Raft log.
|
||||||
* Predicate is a callable of the following prototype:
|
* Predicate is a callable of the following prototype:
|
||||||
* bool (const protocol::dynamic_node_id::server::Entry&)
|
* bool (const LogEntryInfo& entry)
|
||||||
* Once the predicate returns true, the loop will be terminated and the method will return a pointer to the last
|
* Once the predicate returns true, the loop will be terminated and the method will return an initialized lazy
|
||||||
* visited entry; otherwise nullptr will be returned.
|
* contructor to the last visited entry; otherwise the constructor will not be initialized. In this case, lazy
|
||||||
|
* constructor is used as boost::optional.
|
||||||
* The log is always traversed from HIGH to LOW index values, i.e. entry 0 will be traversed last.
|
* The log is always traversed from HIGH to LOW index values, i.e. entry 0 will be traversed last.
|
||||||
*/
|
*/
|
||||||
template <typename Predicate>
|
template <typename Predicate>
|
||||||
const protocol::dynamic_node_id::server::Entry* traverseLogFromEndUntil(const Predicate& predicate) const
|
inline LazyConstructor<LogEntryInfo> traverseLogFromEndUntil(const Predicate& predicate) const
|
||||||
{
|
{
|
||||||
UAVCAN_ASSERT(try_implicit_cast<bool>(predicate, true));
|
UAVCAN_ASSERT(try_implicit_cast<bool>(predicate, true));
|
||||||
for (int index = static_cast<int>(persistent_state_.getLog().getMaxIndex()); index--; index >= 0)
|
for (int index = static_cast<int>(persistent_state_.getLog().getMaxIndex()); index--; index >= 0)
|
||||||
@@ -401,12 +417,15 @@ public:
|
|||||||
const protocol::dynamic_node_id::server::Entry* const entry =
|
const protocol::dynamic_node_id::server::Entry* const entry =
|
||||||
persistent_state_.getLog().getEntryAtIndex(Log::Index(index));
|
persistent_state_.getLog().getEntryAtIndex(Log::Index(index));
|
||||||
UAVCAN_ASSERT(entry != NULL);
|
UAVCAN_ASSERT(entry != NULL);
|
||||||
if (predicate(*entry))
|
const LogEntryInfo info(*entry, Log::Index(index) <= commit_index_);
|
||||||
|
if (predicate(info))
|
||||||
{
|
{
|
||||||
return entry;
|
LazyConstructor<LogEntryInfo> ret;
|
||||||
|
ret.template construct<const LogEntryInfo&>(info);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return LazyConstructor<LogEntryInfo>();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user