@Override public Session removeSession(int sessionId) { Session session = super.removeSession(sessionId); if (netClient != null && getSessions().isEmpty()) { netClient.removeConnection(inetSocketAddress); } return session; }
private Transfer initTransfer(ConnectionInfo ci, NetEndpoint endpoint) throws Exception { NetFactory factory = NetFactoryManager.getFactory(ci.getNetFactoryName()); CaseInsensitiveMap<String> config = new CaseInsensitiveMap<>(ci.getProperties()); AsyncConnection conn = factory.getNetClient().createConnection(config, endpoint); if (!(conn instanceof TcpClientConnection)) { throw DbException.throwInternalError("not tcp client connection: " + conn.getClass().getName()); } tcpConnection = (TcpClientConnection) conn; sessionId = getNextId(); transfer = tcpConnection.createTransfer(this); tcpConnection.writeInitPacket(this, transfer, ci); if (isValid()) { tcpConnection.addSession(sessionId, this); } return transfer; }
public P2pConnection getConnection(NetEndpoint remoteEndpoint) { remoteEndpoint = ClusterMetaData.getPreferredIP(remoteEndpoint); String remoteHostAndPort = remoteEndpoint.getHostAndPort(); P2pConnection conn = connections.get(remoteHostAndPort); if (conn == null) { synchronized (connections) { conn = connections.get(remoteHostAndPort); if (conn != null) return conn; Map<String, String> config = P2pServer.instance.getConfig(); NetFactory factory = NetFactoryManager.getFactory(config); try { conn = (P2pConnection) factory.getNetClient().createConnection(config, remoteEndpoint, this); String localHostAndPort = ConfigDescriptor.getLocalEndpoint().getHostAndPort(); conn.initTransfer(remoteEndpoint, localHostAndPort); // connections.put(remoteHostAndPort, conn); //调用initTransfer成功后已经加到connections } catch (Exception e) { // TODO 是否不应该立刻移除节点 Gossiper.instance.removeEndpoint(remoteEndpoint); logger.error("Failed to connect " + remoteEndpoint, e); throw DbException.convert(e); } } } return conn; }