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:
Pavel Kirienko
2016-02-19 11:25:50 +03:00
parent e13d6dbfd6
commit ab2b952432
3 changed files with 96 additions and 70 deletions
@@ -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_; }
}; };
/** /**