public void AddPeerToClusterEndPoints(TcpPeer peer, bool handshake)
        {
            _sync.EnterWriteLock();
            try
            {
                //Choosing priority connection
                if (!Peers.ContainsKey(peer.EndPointSID))
                {
                    Peers[peer.EndPointSID] = peer;
                    peer.FillNodeAddress();

                    if (handshake)
                    {
                        peer.Send(RaftCommand.HandshakeACK, new TcpMsgHandshake()
                        {
                            NodeListeningPort = trn.port,
                            NodeUID           = trn.GetNode().NodeAddress.NodeUId,
                        });
                    }
                }
                else
                {
                    //Peers[peer.EndPointSID].Send(RaftCommand.Ping,"ping"); //ping
                    //removing incoming connection
                    peer.Dispose(true);
                    return;
                }
            }
            catch (Exception ex)
            {
                //throw;
            }
            finally
            {
                _sync.ExitWriteLock();
            }
        }
Esempio n. 2
0
        public void AddPeerToClusterEndPoints(TcpPeer peer, bool handshake)
        {
            _sync.EnterWriteLock();
            try
            {
                if (peer.Handshake.NodeUID == trn.GetNodeByEntityName("default").NodeAddress.NodeUId)   //Self disconnect
                {
                    trn.NodeSettings.TcpClusterEndPoints.Where(r => r.EndPointSID == peer.EndPointSID)
                    .FirstOrDefault().Me = true;

                    peer.Dispose(true);
                    return;
                }

                //Choosing priority connection
                if (!Peers.ContainsKey(peer.EndPointSID))
                {
                    if (handshake && trn.GetNodeByEntityName("default").NodeAddress.NodeUId > peer.Handshake.NodeUID)
                    {
                        //trn.log.Log(new WarningLogEntry()
                        //{
                        //    LogType = WarningLogEntry.eLogType.DEBUG,
                        //    Description = $"{trn.port}> !!!!!dropped{peer.Handshake.NodeListeningPort} {peer.Handshake.NodeListeningPort} on handshake as weak"
                        //});


                        peer.Dispose(true);
                        return;
                    }

                    Peers[peer.EndPointSID] = peer;
                    peer.FillNodeAddress();

                    //trn.log.Log(new WarningLogEntry()
                    //{
                    //    LogType = WarningLogEntry.eLogType.DEBUG,
                    //    Description = $"{trn.port}> >>>>>>connected{peer.Handshake.NodeListeningPort}  {peer.Handshake.NodeListeningPort} by {(handshake ? "handshake" : "ACK")} with diff: {(trn.rn.NodeAddress.NodeUId - peer.Handshake.NodeUID)}"
                    //});

                    if (handshake)
                    {
                        //sending back handshake ack

                        peer.Write(
                            cSprot1Parser.GetSprot1Codec(
                                new byte[] { 00, 03 }, (new TcpMsgHandshake()
                        {
                            NodeListeningPort = trn.port,
                            NodeUID = trn.GetNodeByEntityName("default").NodeAddress.NodeUId,
                        }).SerializeBiser())
                            );
                    }
                }
                else
                {
                    //trn.log.Log(new WarningLogEntry()
                    //{
                    //    LogType = WarningLogEntry.eLogType.DEBUG,
                    //    Description = $"{trn.port}> !!!!!dropped{peer.Handshake.NodeListeningPort} {peer.Handshake.NodeListeningPort} as existing"
                    //});

                    //Sending ping on existing connection (may be it is alredy old)

                    Peers[peer.EndPointSID].Write(cSprot1Parser.GetSprot1Codec(new byte[] { 00, 05 }, null)); //ping

                    //removing incoming connection
                    peer.Dispose(true);

                    return;
                }
            }
            catch (Exception ex)
            {
                //throw;
            }
            finally
            {
                _sync.ExitWriteLock();
            }
        }