mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-01 07:11:35 +08:00
Refactored the dynamic node ID allocation server: added a new class AbstractServer, which is inherited by CentralizedServer and DistributedServer. This change allowed to move the data and logic that is common to both types of servers to a single location. In the next step this will be used to add more complex common logic.
This commit is contained in:
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_SERVER_HPP_INCLUDED
|
||||||
|
#define UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_SERVER_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <uavcan/build_config.hpp>
|
||||||
|
#include <uavcan/debug.hpp>
|
||||||
|
#include <uavcan/protocol/dynamic_node_id_server/allocation_request_manager.hpp>
|
||||||
|
#include <uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp>
|
||||||
|
#include <uavcan/protocol/dynamic_node_id_server/event.hpp>
|
||||||
|
|
||||||
|
namespace uavcan
|
||||||
|
{
|
||||||
|
namespace dynamic_node_id_server
|
||||||
|
{
|
||||||
|
|
||||||
|
class AbstractServer : protected IAllocationRequestHandler
|
||||||
|
, protected INodeDiscoveryHandler
|
||||||
|
{
|
||||||
|
UniqueID own_unique_id_;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
INode& node_;
|
||||||
|
IEventTracer& tracer_;
|
||||||
|
AllocationRequestManager allocation_request_manager_;
|
||||||
|
NodeDiscoverer node_discoverer_;
|
||||||
|
|
||||||
|
AbstractServer(INode& node,
|
||||||
|
IEventTracer& tracer) :
|
||||||
|
node_(node),
|
||||||
|
tracer_(tracer),
|
||||||
|
allocation_request_manager_(node, tracer, *this),
|
||||||
|
node_discoverer_(node, tracer, *this)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
const UniqueID& getOwnUniqueID() const { return own_unique_id_; }
|
||||||
|
|
||||||
|
int init(const UniqueID& own_unique_id, const TransferPriority priority)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
own_unique_id_ = own_unique_id;
|
||||||
|
|
||||||
|
res = allocation_request_manager_.init(priority);
|
||||||
|
if (res < 0)
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = node_discoverer_.init(priority);
|
||||||
|
if (res < 0)
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
const NodeDiscoverer& getNodeDiscoverer() const { return node_discoverer_; }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Include guard
|
||||||
@@ -7,8 +7,7 @@
|
|||||||
|
|
||||||
#include <uavcan/build_config.hpp>
|
#include <uavcan/build_config.hpp>
|
||||||
#include <uavcan/debug.hpp>
|
#include <uavcan/debug.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/allocation_request_manager.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/abstract_server.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp>
|
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/node_id_selector.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/node_id_selector.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/storage_marshaller.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/storage_marshaller.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/centralized/storage.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/centralized/storage.hpp>
|
||||||
@@ -26,15 +25,8 @@ namespace centralized
|
|||||||
*
|
*
|
||||||
* This version is suitable only for simple non-critical systems.
|
* This version is suitable only for simple non-critical systems.
|
||||||
*/
|
*/
|
||||||
class Server : IAllocationRequestHandler
|
class Server : public AbstractServer
|
||||||
, INodeDiscoveryHandler
|
|
||||||
{
|
{
|
||||||
UniqueID own_unique_id_;
|
|
||||||
|
|
||||||
INode& node_;
|
|
||||||
IEventTracer& tracer_;
|
|
||||||
AllocationRequestManager allocation_request_manager_;
|
|
||||||
NodeDiscoverer node_discoverer_;
|
|
||||||
Storage storage_;
|
Storage storage_;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -128,10 +120,7 @@ public:
|
|||||||
Server(INode& node,
|
Server(INode& node,
|
||||||
IStorageBackend& storage,
|
IStorageBackend& storage,
|
||||||
IEventTracer& tracer)
|
IEventTracer& tracer)
|
||||||
: node_(node)
|
: AbstractServer(node, tracer)
|
||||||
, tracer_(tracer)
|
|
||||||
, allocation_request_manager_(node, tracer, *this)
|
|
||||||
, node_discoverer_(node, tracer, *this)
|
|
||||||
, storage_(storage)
|
, storage_(storage)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@@ -147,13 +136,20 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Common logic
|
||||||
|
*/
|
||||||
|
res = AbstractServer::init(own_unique_id, priority);
|
||||||
|
if (res < 0)
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Making sure that the server is started with the same node ID
|
* Making sure that the server is started with the same node ID
|
||||||
*/
|
*/
|
||||||
own_unique_id_ = own_unique_id;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const NodeID stored_own_node_id = storage_.getNodeIDForUniqueID(own_unique_id_);
|
const NodeID stored_own_node_id = storage_.getNodeIDForUniqueID(getOwnUniqueID());
|
||||||
if (stored_own_node_id.isValid())
|
if (stored_own_node_id.isValid())
|
||||||
{
|
{
|
||||||
if (stored_own_node_id != node_.getNodeID())
|
if (stored_own_node_id != node_.getNodeID())
|
||||||
@@ -163,7 +159,7 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = storage_.add(node_.getNodeID(), own_unique_id_);
|
res = storage_.add(node_.getNodeID(), getOwnUniqueID());
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
return res;
|
return res;
|
||||||
@@ -171,21 +167,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Misc
|
|
||||||
*/
|
|
||||||
res = allocation_request_manager_.init(priority);
|
|
||||||
if (res < 0)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = node_discoverer_.init(priority);
|
|
||||||
if (res < 0)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,8 @@
|
|||||||
#include <uavcan/debug.hpp>
|
#include <uavcan/debug.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/distributed/types.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/distributed/types.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/allocation_request_manager.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/abstract_server.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/node_id_selector.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/node_id_selector.hpp>
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp>
|
|
||||||
#include <uavcan/protocol/dynamic_node_id_server/event.hpp>
|
#include <uavcan/protocol/dynamic_node_id_server/event.hpp>
|
||||||
|
|
||||||
namespace uavcan
|
namespace uavcan
|
||||||
@@ -23,8 +22,7 @@ namespace distributed
|
|||||||
/**
|
/**
|
||||||
* This class implements the top-level allocation logic and server API.
|
* This class implements the top-level allocation logic and server API.
|
||||||
*/
|
*/
|
||||||
class UAVCAN_EXPORT Server : IAllocationRequestHandler
|
class UAVCAN_EXPORT Server : public AbstractServer
|
||||||
, INodeDiscoveryHandler
|
|
||||||
, IRaftLeaderMonitor
|
, IRaftLeaderMonitor
|
||||||
{
|
{
|
||||||
struct UniqueIDLogPredicate
|
struct UniqueIDLogPredicate
|
||||||
@@ -55,19 +53,10 @@ class UAVCAN_EXPORT Server : IAllocationRequestHandler
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
UniqueID own_unique_id_;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* States
|
* States
|
||||||
*/
|
*/
|
||||||
INode& node_;
|
|
||||||
IEventTracer& tracer_;
|
|
||||||
RaftCore raft_core_;
|
RaftCore raft_core_;
|
||||||
AllocationRequestManager allocation_request_manager_;
|
|
||||||
NodeDiscoverer node_discoverer_;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Methods of IAllocationRequestHandler
|
* Methods of IAllocationRequestHandler
|
||||||
@@ -196,7 +185,7 @@ class UAVCAN_EXPORT Server : IAllocationRequestHandler
|
|||||||
|
|
||||||
if (!result.isConstructed())
|
if (!result.isConstructed())
|
||||||
{
|
{
|
||||||
raft_core_.appendLog(own_unique_id_, node_.getNodeID());
|
raft_core_.appendLog(getOwnUniqueID(), node_.getNodeID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,11 +228,8 @@ public:
|
|||||||
Server(INode& node,
|
Server(INode& node,
|
||||||
IStorageBackend& storage,
|
IStorageBackend& storage,
|
||||||
IEventTracer& tracer)
|
IEventTracer& tracer)
|
||||||
: node_(node)
|
: AbstractServer(node, tracer)
|
||||||
, tracer_(tracer)
|
|
||||||
, raft_core_(node, storage, tracer, *this)
|
, raft_core_(node, storage, tracer, *this)
|
||||||
, allocation_request_manager_(node, tracer, *this)
|
|
||||||
, node_discoverer_(node, tracer, *this)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
int init(const UniqueID& own_unique_id,
|
int init(const UniqueID& own_unique_id,
|
||||||
@@ -259,37 +245,29 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Common logic
|
||||||
|
*/
|
||||||
|
res = AbstractServer::init(own_unique_id, priority);
|
||||||
|
if (res < 0)
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Making sure that the server is started with the same node ID
|
* Making sure that the server is started with the same node ID
|
||||||
*/
|
*/
|
||||||
own_unique_id_ = own_unique_id;
|
|
||||||
|
|
||||||
const LazyConstructor<RaftCore::LogEntryInfo> own_log_entry =
|
const LazyConstructor<RaftCore::LogEntryInfo> own_log_entry =
|
||||||
raft_core_.traverseLogFromEndUntil(NodeIDLogPredicate(node_.getNodeID()));
|
raft_core_.traverseLogFromEndUntil(NodeIDLogPredicate(node_.getNodeID()));
|
||||||
|
|
||||||
if (own_log_entry.isConstructed())
|
if (own_log_entry.isConstructed())
|
||||||
{
|
{
|
||||||
if (own_log_entry->entry.unique_id != own_unique_id_)
|
if (own_log_entry->entry.unique_id != getOwnUniqueID())
|
||||||
{
|
{
|
||||||
return -ErrInvalidConfiguration;
|
return -ErrInvalidConfiguration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Misc
|
|
||||||
*/
|
|
||||||
res = allocation_request_manager_.init(priority);
|
|
||||||
if (res < 0)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = node_discoverer_.init(priority);
|
|
||||||
if (res < 0)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +277,6 @@ public:
|
|||||||
* These accessors are needed for debugging, visualization and testing.
|
* These accessors are needed for debugging, visualization and testing.
|
||||||
*/
|
*/
|
||||||
const RaftCore& getRaftCore() const { return raft_core_; }
|
const RaftCore& getRaftCore() const { return raft_core_; }
|
||||||
const NodeDiscoverer& getNodeDiscoverer() const { return node_discoverer_; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user