private void reload_update_inbound(ReloadMessage recmsg)
{
UpdateReqAns req_answ = (UpdateReqAns)recmsg.reload_message_body;
NodeId OriginatorID = recmsg.OriginatorID;
Boolean force_send_update = false;
if (recmsg.IsRequest())
{
m_ReloadConfig.Logger(ReloadGlobals.TRACEFLAGS.T_RELOAD,
String.Format("{0} ==> {1} TransId={2:x16}",
RELOAD_MessageCode.Update_Answer.ToString().PadRight(16, ' '),
OriginatorID, recmsg.TransactionID));
ReloadMessage sendmsg = create_update_answ(
new Destination(OriginatorID), recmsg.TransactionID,
RELOAD_ErrorCode.invalid);
recmsg.PutViaListToDestination(sendmsg);
send(sendmsg, m_topology.routing_table.GetNode(recmsg.LastHopNodeId));
//NodeId originator = recmsg.OriginatorID;
m_topology.routing_table.SetNodeState(OriginatorID,
NodeState.updates_received);
m_topology.routing_table.SetFingerState(OriginatorID,
NodeState.updates_received);
if (req_answ.Successors.Count > 0)
{
m_topology.routing_table.GetNode(OriginatorID).Successors = req_answ.Successors;
m_topology.routing_table.GetNode(OriginatorID).Predecessors = req_answ.Predecessors;
}
if (m_ReloadConfig.State == ReloadConfig.RELOAD_State.Joining)
{
if (m_ReloadConfig.AdmittingPeer != null &&
OriginatorID == m_ReloadConfig.AdmittingPeer.Id)
{
if (!m_topology.routing_table.IsWaitForJoinAnsw(OriginatorID))
{
//we received an update from admitting peer, now joining is complete
m_ReloadConfig.State = ReloadConfig.RELOAD_State.Joined;
m_machine.StateUpdates(ReloadConfig.RELOAD_State.Joined);
m_ReloadConfig.Logger(ReloadGlobals.TRACEFLAGS.T_RELOAD,
String.Format("Joining completed"));
m_ReloadConfig.LastJoinedTime = DateTime.Now;
force_send_update = true;
}
}
}
//inform topo about incoming update
Arbiter.Activate(m_DispatcherQueue,
new IterativeTask<NodeId, UpdateReqAns, Boolean>(
OriginatorID, req_answ, force_send_update, m_topology.routing_table.Merge));
// delete old entries in LeavingTable
List<NodeId> expiredNodes = new List<NodeId>();
foreach (KeyValuePair<NodeId, DateTime> entry in m_topology.routing_table.LeavingNodes)
{
if (entry.Value.AddSeconds(300) < DateTime.Now)
expiredNodes.Add(entry.Key);
}
foreach (NodeId id in expiredNodes)
m_topology.routing_table.LeavingNodes.Remove(id);
}
else
{
m_ReloadConfig.Logger(ReloadGlobals.TRACEFLAGS.T_TOPO, "Incoming UpdateAns");
}
}