Partially refactored ServiceClient, tests are failing, the code is totally broken

This commit is contained in:
Pavel Kirienko
2015-05-15 18:41:38 +03:00
parent ee761eebad
commit 282b995c1e
15 changed files with 435 additions and 307 deletions
@@ -327,9 +327,9 @@ class RaftCore : private TimerBase
for (uint8_t i = 0; i < NumRequestVoteClients; i++)
{
request_vote_clients_[i]->cancel();
request_vote_clients_[i]->cancelAll(); // TODO FIXME Concurrent calls!!
}
append_entries_client_.cancel();
append_entries_client_.cancelAll();
/*
* Calling the switch handler
@@ -550,22 +550,23 @@ class RaftCore : private TimerBase
return;
}
if (result.response.term > persistent_state_.getCurrentTerm())
if (result.getResponse().term > persistent_state_.getCurrentTerm())
{
tryIncrementCurrentTermFromResponse(result.response.term);
tryIncrementCurrentTermFromResponse(result.getResponse().term);
}
else
{
if (result.response.success)
if (result.getResponse().success)
{
cluster_.incrementServerNextIndexBy(result.server_node_id, pending_append_entries_fields_.num_entries);
cluster_.setServerMatchIndex(result.server_node_id,
cluster_.incrementServerNextIndexBy(result.getCallID().server_node_id,
pending_append_entries_fields_.num_entries);
cluster_.setServerMatchIndex(result.getCallID().server_node_id,
Log::Index(pending_append_entries_fields_.prev_log_index +
pending_append_entries_fields_.num_entries));
}
else
{
cluster_.decrementServerNextIndex(result.server_node_id);
cluster_.decrementServerNextIndex(result.getCallID().server_node_id);
}
}
@@ -654,15 +655,15 @@ class RaftCore : private TimerBase
return;
}
trace(TraceRaftVoteRequestSucceeded, result.server_node_id.get());
trace(TraceRaftVoteRequestSucceeded, result.getCallID().server_node_id.get());
if (result.response.term > persistent_state_.getCurrentTerm())
if (result.getResponse().term > persistent_state_.getCurrentTerm())
{
tryIncrementCurrentTermFromResponse(result.response.term);
tryIncrementCurrentTermFromResponse(result.getResponse().term);
}
else
{
if (result.response.vote_granted)
if (result.getResponse().vote_granted)
{
num_votes_received_in_this_campaign_++;
}
@@ -235,14 +235,14 @@ class NodeDiscoverer : TimerBase
if (result.isSuccessful())
{
UAVCAN_TRACE("dynamic_node_id_server::NodeDiscoverer", "GetNodeInfo response from %d",
int(result.server_node_id.get()));
finalizeNodeDiscovery(&result.response.hardware_version.unique_id, result.server_node_id);
int(result.getCallID().server_node_id.get()));
finalizeNodeDiscovery(&result.getResponse().hardware_version.unique_id, result.getCallID().server_node_id);
}
else
{
trace(TraceDiscoveryGetNodeInfoFailure, result.server_node_id.get());
trace(TraceDiscoveryGetNodeInfoFailure, result.getCallID().server_node_id.get());
NodeData* const data = node_map_.access(result.server_node_id);
NodeData* const data = node_map_.access(result.getCallID().server_node_id);
if (data == NULL)
{
return; // Probably it is a known node now
@@ -250,11 +250,11 @@ class NodeDiscoverer : TimerBase
UAVCAN_TRACE("dynamic_node_id_server::NodeDiscoverer",
"GetNodeInfo request to %d has timed out, %d attempts",
int(result.server_node_id.get()), int(data->num_get_node_info_attempts));
int(result.getCallID().server_node_id.get()), int(data->num_get_node_info_attempts));
data->num_get_node_info_attempts++;
if (data->num_get_node_info_attempts >= MaxAttemptsToGetNodeInfo)
{
finalizeNodeDiscovery(NULL, result.server_node_id);
finalizeNodeDiscovery(NULL, result.getCallID().server_node_id);
// Warning: data pointer is invalidated now
}
}
@@ -262,7 +262,7 @@ class NodeDiscoverer : TimerBase
void handleTimerEvent(const TimerEvent&)
{
if (get_node_info_client_.isPending())
if (get_node_info_client_.hasPendingCalls())
{
return;
}
@@ -87,7 +87,7 @@ class UAVCAN_EXPORT NetworkCompatibilityChecker : Noncopyable
int waitForCATSResponse()
{
while (cats_cln_.isPending())
while (cats_cln_.hasPendingCalls())
{
const int res = getNode().spin(MonotonicDuration::fromMSec(10));
if (res < 0 || !result_.isOk())
@@ -119,15 +119,15 @@ class UAVCAN_EXPORT NetworkCompatibilityChecker : Noncopyable
if (last_cats_request_ok_)
{
const DataTypeSignature sign = GlobalDataTypeRegistry::instance().
computeAggregateSignature(checking_dtkind_, resp.response.mutually_known_ids);
computeAggregateSignature(checking_dtkind_, resp.getResponse().mutually_known_ids);
UAVCAN_TRACE("NodeInitializer", "CATS response from nid=%i; local=%llu remote=%llu",
int(resp.server_node_id.get()), static_cast<unsigned long long>(sign.get()),
static_cast<unsigned long long>(resp.response.aggregate_signature));
int(resp.getCallID().server_node_id.get()), static_cast<unsigned long long>(sign.get()),
static_cast<unsigned long long>(resp.getResponse().aggregate_signature));
if (sign.get() != resp.response.aggregate_signature)
if (sign.get() != resp.getResponse().aggregate_signature)
{
result_.conflicting_node = resp.server_node_id;
result_.conflicting_node = resp.getCallID().server_node_id;
}
}
}
@@ -138,7 +138,7 @@ class UAVCAN_EXPORT NetworkCompatibilityChecker : Noncopyable
StaticAssert<DataTypeKindService == int(protocol::DataTypeKind::SERVICE)>::check();
UAVCAN_ASSERT(nid.isUnicast());
UAVCAN_ASSERT(!cats_cln_.isPending());
UAVCAN_ASSERT(!cats_cln_.hasPendingCalls());
checking_dtkind_ = kind;
protocol::ComputeAggregateTypeSignature::Request request;
@@ -253,7 +253,7 @@ public:
exit:
ns_sub_.stop();
cats_cln_.cancel();
cats_cln_.cancelAll();
return res;
}
@@ -196,9 +196,9 @@ private:
virtual void handleTimerEvent(const TimerEvent&)
{
if (get_node_info_client_.isPending()) // If request is pending, this condition will fail every second time
if (get_node_info_client_.hasPendingCalls()) // If request is pending, this condition will fail every second time
{
return;
return; // TODO FIXME Concurrent calls!!
}
const NodeID next = pickNextNodeToQuery();
@@ -277,7 +277,7 @@ private:
void handleGetNodeInfoResponse(const ServiceCallResult<protocol::GetNodeInfo>& result)
{
Entry& entry = getEntry(result.server_node_id);
Entry& entry = getEntry(result.getCallID().server_node_id);
if (result.isSuccessful())
{
@@ -285,9 +285,10 @@ private:
* Updating the uptime here allows to properly handle a corner case where the service response arrives
* after the device has restarted and published its new NodeStatus (although it's unlikely to happen).
*/
entry.uptime_sec = result.response.status.uptime_sec;
entry.uptime_sec = result.getResponse().status.uptime_sec;
entry.request_needed = false;
listeners_.removeWhere(NodeInfoRetrievedHandlerCaller(result.server_node_id, result.response));
listeners_.removeWhere(NodeInfoRetrievedHandlerCaller(result.getCallID().server_node_id,
result.getResponse()));
}
else
{
@@ -298,7 +299,7 @@ private:
{
entry.request_needed = false;
listeners_.removeWhere(GenericHandlerCaller<NodeID>(&INodeInfoListener::handleNodeInfoUnavailable,
result.server_node_id));
result.getCallID().server_node_id));
}
}
}