@Override public ClientSessionFactory createSessionFactory(String nodeID) throws Exception { TopologyMember topologyMember = topology.getMember(nodeID); if (logger.isTraceEnabled()) { logger.trace("Creating connection factory towards " + nodeID + " = " + topologyMember + ", topology=" + topology.describe()); } if (topologyMember == null) { return null; } if (topologyMember.getLive() != null) { ClientSessionFactoryInternal factory = (ClientSessionFactoryInternal) createSessionFactory(topologyMember.getLive()); if (topologyMember.getBackup() != null) { factory.setBackupConnector(topologyMember.getLive(), topologyMember.getBackup()); } return factory; } if (topologyMember.getLive() == null && topologyMember.getBackup() != null) { // This shouldn't happen, however I wanted this to consider all possible cases ClientSessionFactoryInternal factory = (ClientSessionFactoryInternal) createSessionFactory(topologyMember.getBackup()); return factory; } // it shouldn't happen return null; }
private void internalUpdateArray(long time) { synchronized (topologyArrayGuard) { Collection<TopologyMemberImpl> membersCopy = topology.getMembers(); Pair<TransportConfiguration, TransportConfiguration>[] topologyArrayLocal = (Pair<TransportConfiguration, TransportConfiguration>[]) Array.newInstance(Pair.class, membersCopy.size()); int count = 0; for (TopologyMemberImpl pair : membersCopy) { Pair<TransportConfiguration, TransportConfiguration> transportConfigs = pair.getConnector(); topologyArrayLocal[count++] = new Pair<>(protocolManagerFactory.adaptTransportConfiguration(transportConfigs.getA()), protocolManagerFactory.adaptTransportConfiguration(transportConfigs.getB())); } this.topologyArray = topologyArrayLocal; } }
/** * Create a ServerLocatorImpl using UDP discovery to lookup cluster */ public ServerLocatorImpl(final boolean useHA, final DiscoveryGroupConfiguration groupConfiguration) { this(new Topology(null), useHA, groupConfiguration, null); if (useHA) { // We only set the owner at where the Topology was created. // For that reason we can't set it at the main constructor topology.setOwner(this); } }
topology.removeMember(eventTime, nodeID); if (topology.isEmpty()) { updateArraysAndPairs(eventTime); if (topology.nodes() == 1 && topology.getMember(this.nodeID) != null) {
/** * This is called by the server when the node is activated from backup state. It will always succeed */ public TopologyMemberImpl updateBackup(final TopologyMemberImpl memberInput) { final String nodeId = memberInput.getNodeId(); if (logger.isTraceEnabled()) { logger.trace(this + "::updateBackup::" + nodeId + ", memberInput=" + memberInput); } synchronized (this) { TopologyMemberImpl currentMember = getMember(nodeId); if (currentMember == null) { if (logger.isTraceEnabled()) { logger.trace("There's no live to be updated on backup update, node=" + nodeId + " memberInput=" + memberInput, new Exception("trace")); } currentMember = memberInput; topology.put(nodeId, currentMember); } TopologyMemberImpl newMember = new TopologyMemberImpl(nodeId, currentMember.getBackupGroupName(), currentMember.getScaleDownGroupName(), currentMember.getLive(), memberInput.getBackup()); newMember.setUniqueEventID(System.currentTimeMillis()); topology.remove(nodeId); topology.put(nodeId, newMember); sendMemberUp(nodeId, newMember); return newMember; } }
newInitialconnectors[count++] = entry.getConnector(); if (ha && topology.getMember(entry.getNodeID()) == null) { TopologyMemberImpl member = new TopologyMemberImpl(entry.getNodeID(), null, null, entry.getConnector(), null); topology.updateMember(0, entry.getNodeID(), member);
public synchronized String describe() { return describe(""); }
private TopologyMember getLocalMember() { return topology.getMember(manager.getNodeId()); }
@Override public ServerLocatorImpl addClusterTopologyListener(final ClusterTopologyListener listener) { topology.addClusterTopologyListener(listener); return this; }
@Override public void removeClusterTopologyListener(final ClusterTopologyListener listener) { topology.removeClusterTopologyListener(listener); }
backupNodesCount = 0; for (TopologyMemberImpl member : topology.getMembers()) { if (member.getLive() != null) { liveNodesCount++; " (received live=" + liveNodesCount + ", backup=" + backupNodesCount + ") topology = " + topology.describe() + ")";
@Override public void resetToInitialConnectors() { receivedTopology = false; topologyArray = null; topology.clear(); }
traceException.fillInStackTrace(); this.topology = topology == null ? new Topology(this) : topology;
@Override public void nodeAnnounced(final long uniqueEventID, final String nodeID, final String backupGroupName, final String scaleDownGroupName, final Pair<TransportConfiguration, TransportConfiguration> connectorPair, final boolean backup) { if (logger.isDebugEnabled()) { logger.debug(this + "::NodeAnnounced, backup=" + backup + nodeID + connectorPair); } TransportConfiguration live = connectorPair.getA(); TransportConfiguration backupTC = connectorPair.getB(); TopologyMemberImpl newMember = new TopologyMemberImpl(nodeID, backupGroupName, scaleDownGroupName, live, backupTC); newMember.setUniqueEventID(uniqueEventID); if (backup) { topology.updateBackup(new TopologyMemberImpl(nodeID, backupGroupName, scaleDownGroupName, live, backupTC)); } else { topology.updateMember(uniqueEventID, nodeID, newMember); } }
@Override public boolean isSatisfied() throws Exception { return !locator.getTopology().isEmpty(); } }, 5000);
@Test public void testReceiveNotificationsWhenOtherNodesAreStartedAndStopped() throws Throwable { startServers(0); ServerLocator locator = createHAServerLocator(); locator.getTopology().setOwner("testReceive"); final List<String> nodes = Collections.synchronizedList(new ArrayList<String>()); final CountDownLatch upLatch = new CountDownLatch(5); final CountDownLatch downLatch = new CountDownLatch(4); locator.addClusterTopologyListener(new LatchListener(upLatch, nodes, downLatch)); ClientSessionFactory sf = createSessionFactory(locator); startServers(1, 4, 3, 2); String[] nodeIDs = getNodeIDs(0, 1, 2, 3, 4); Assert.assertTrue("Was not notified that all servers are UP", upLatch.await(10, SECONDS)); checkContains(new int[]{0, 1, 4, 3, 2}, nodeIDs, nodes); waitForClusterConnections(0, 4); waitForClusterConnections(1, 4); waitForClusterConnections(2, 4); waitForClusterConnections(3, 4); waitForClusterConnections(4, 4); stopServers(2, 3, 1, 4); Assert.assertTrue("Was not notified that all servers are DOWN", downLatch.await(10, SECONDS)); checkContains(new int[]{0}, nodeIDs, nodes); sf.close(); locator.close(); stopServers(0); }
topology.removeMember(eventTime, nodeID); if (topology.isEmpty()) { updateArraysAndPairs(eventTime); if (topology.nodes() == 1 && topology.getMember(this.nodeID) != null) {
@Override public void notifyNodeUp(long uniqueEventID, final String nodeID, final String backupGroupName, final String scaleDownGroupName, final Pair<TransportConfiguration, TransportConfiguration> connectorPair, final boolean last) { if (logger.isTraceEnabled()) { logger.trace("NodeUp " + this + "::nodeID=" + nodeID + ", connectorPair=" + connectorPair, new Exception("trace")); } TopologyMemberImpl member = new TopologyMemberImpl(nodeID, backupGroupName, scaleDownGroupName, connectorPair.getA(), connectorPair.getB()); topology.updateMember(uniqueEventID, nodeID, member); TopologyMember actMember = topology.getMember(nodeID); if (actMember != null && actMember.getLive() != null && actMember.getBackup() != null) { HashSet<ClientSessionFactory> clonedFactories = new HashSet<>(); synchronized (factories) { clonedFactories.addAll(factories); } for (ClientSessionFactory factory : clonedFactories) { ((ClientSessionFactoryInternal) factory).setBackupConnector(actMember.getLive(), actMember.getBackup()); } } updateArraysAndPairs(uniqueEventID); if (last) { receivedTopology = true; } }
public synchronized String describe() { return describe(""); }
public TransportConfiguration getLiveTransportConfiguration(String targetServerID) { TopologyMemberImpl member = clusterController.getDefaultClusterTopology().getMember(targetServerID); return member != null ? member.getLive() : null; }