FailbackChecker() { TransportConfiguration connector = activeMQServer.getClusterManager().getDefaultConnection(null).getConnector(); backupListener = new BackupTopologyListener(activeMQServer.getNodeID().toString(), connector); activeMQServer.getClusterManager().getDefaultConnection(null).addClusterTopologyListener(backupListener); }
private ClusterConnection lookupClusterConnection(TransportConfiguration acceptorConfig) { String clusterConnectionName = (String) acceptorConfig.getParams().get(org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants.CLUSTER_CONNECTION); ClusterConnection clusterConnection = null; if (clusterConnectionName != null) { clusterConnection = clusterManager.getClusterConnection(clusterConnectionName); } // if not found we will still use the default name, even if a name was provided if (clusterConnection == null) { clusterConnection = clusterManager.getDefaultConnection(acceptorConfig); } return clusterConnection; }
/** * It will iterate the cluster connections until you have at least the number of expected servers * * @param timeWait Time to wait on each iteration * @param unit unit of time to wait * @param iterations number of iterations * @param servers number of minimal servers * @return */ public boolean waitClusterForming(long timeWait, TimeUnit unit, int iterations, int servers) throws Exception { if (activeMQServer.getClusterManager().getClusterConnections() == null || activeMQServer.getClusterManager().getClusterConnections().size() == 0) { return servers == 0; } for (int i = 0; i < iterations; i++) { for (ClusterConnection connection : activeMQServer.getClusterManager().getClusterConnections()) { if (connection.getTopology().getMembers().size() == servers) { return true; } Thread.sleep(unit.toMillis(timeWait)); } } return false; }
public void updateAsLive() { if (!stopping && started) { topology.updateAsLive(manager.getNodeId(), new TopologyMemberImpl(manager.getNodeId(), manager.getBackupGroupName(), manager.getScaleDownGroupName(), connector, null)); } }
@Override public void onConnection(ClientSessionFactoryInternal sf) { TopologyMember localMember = getLocalMember(); if (localMember != null) { ClusterControl clusterControl = manager.getClusterController().connectToNodeInCluster(sf); try { clusterControl.authorize(); clusterControl.sendNodeAnnounce(localMember.getUniqueEventID(), manager.getNodeId(), manager.getBackupGroupName(), manager.getScaleDownGroupName(), false, localMember.getLive(), localMember.getBackup()); } catch (ActiveMQException e) { ActiveMQServerLogger.LOGGER.clusterControlAuthfailure(); } } else { ActiveMQServerLogger.LOGGER.noLocalMemborOnClusterConnection(this); } // TODO: shouldn't we send the current time here? and change the current topology? // sf.sendNodeAnnounce(System.currentTimeMillis(), // manager.getNodeId(), // false, // localMember.getConnector().a, // localMember.getConnector().b); }
Set<ClusterConnection> ccs = server.getClusterManager().getClusterConnections(); Topology topology = server.getClusterManager().getDefaultConnection(null).getTopology();
private void makeSureForwardingFlowControl(int producerWindow, int... indices) throws NoSuchFieldException, IllegalAccessException { for (int i : indices) { ClusterConnectionImpl cc = (ClusterConnectionImpl) servers[i].getClusterManager().getClusterConnection("cluster" + i); Map<String, MessageFlowRecord> map = cc.getRecords(); assertEquals(1, map.size()); MessageFlowRecord record = map.entrySet().iterator().next().getValue(); Field f = record.getClass().getDeclaredField("targetLocator"); //NoSuchFieldException f.setAccessible(true); ServerLocatorInternal targetLocator = (ServerLocatorInternal) f.get(record); assertEquals(producerWindow, targetLocator.getProducerWindowSize()); } }
private static ActiveMQServer selectServer(HttpServerExchange exchange, ActiveMQServer rootServer) { String activemqServerName = exchange.getRequestHeaders().getFirst(TransportConstants.ACTIVEMQ_SERVER_NAME); if (activemqServerName == null) { return rootServer; } ClusterManager clusterManager = rootServer.getClusterManager(); if (clusterManager != null) { HAManager haManager = clusterManager.getHAManager(); if (haManager != null) { for (Map.Entry<String, ActiveMQServer> entry : haManager.getBackupServers().entrySet()) { if (entry.getKey().equals(activemqServerName)) { return entry.getValue(); } } } } if (activemqServerName.equals(rootServer.getConfiguration().getName())) { return rootServer; } else { return null; } }
@Override public void haStarted() { activeMQServer.getClusterManager().getClusterController().setReplicatedClusterName(replicaPolicy.getClusterName()); }
public static void crashAndWaitForFailure(ActiveMQServer server, ClientSession... sessions) throws Exception { CountDownLatch latch = new CountDownLatch(sessions.length); for (ClientSession session : sessions) { CountDownSessionFailureListener listener = new CountDownSessionFailureListener(latch, session); session.addFailureListener(listener); } ClusterManager clusterManager = server.getClusterManager(); clusterManager.flushExecutor(); clusterManager.clear(); Assert.assertTrue("server should be running!", server.isStarted()); server.fail(true); if (sessions.length > 0) { // Wait to be informed of failure boolean ok = latch.await(10000, TimeUnit.MILLISECONDS); Assert.assertTrue("Failed to stop the server! Latch count is " + latch.getCount() + " out of " + sessions.length, ok); } }
public void resendLive() { if (!stopping && started) { topology.resendNode(manager.getNodeId()); } } }
return; backupQuorum = new SharedNothingBackupQuorum(activeMQServer.getStorageManager(), activeMQServer.getNodeManager(), activeMQServer.getScheduledPool(), networkHealthCheck, replicaPolicy.getQuorumSize(), replicaPolicy.getVoteRetries(), replicaPolicy.getVoteRetryWait(), replicaPolicy.getQuorumVoteWait()); activeMQServer.getClusterManager().getQuorumManager().registerQuorum(backupQuorum); activeMQServer.getClusterManager().getQuorumManager().registerQuorumHandler(new ServerConnectVoteHandler(activeMQServer)); nodeLocator = replicaPolicy.getGroupName() == null ? new AnyLiveNodeLocatorForReplication(backupQuorum, activeMQServer, replicaPolicy.getRetryReplicationWait()) : new NamedLiveNodeLocatorForReplication(replicaPolicy.getGroupName(), backupQuorum, replicaPolicy.getRetryReplicationWait()); ClusterController clusterController = activeMQServer.getClusterManager().getClusterController(); clusterController.addClusterTopologyListenerForReplication(nodeLocator); activeMQServer.getClusterManager().getQuorumManager().unRegisterQuorum(backupQuorum);
clusterManager = new ClusterManager(executorFactory, this, postOffice, scheduledPool, managementService, configuration, nodeManager, haPolicy.isBackup()); clusterManager.deploy();
@Override public String describe() { StringWriter str = new StringWriter(); PrintWriter out = new PrintWriter(str); out.println(ActiveMQMessageBundle.BUNDLE.serverDescribe(identity, getClusterManager().describe())); return str.toString(); }
@Override public ClusterManager getClusterManager() { return new ClusterManager(getExecutorFactory(), this, null, null, null, null, null, false); }
public static void crash(ActiveMQServer server, ClientSession... sessions) throws Exception { final CountDownLatch latch = new CountDownLatch(sessions.length); class MyListener implements SessionFailureListener { @Override public void connectionFailed(final ActiveMQException me, boolean failedOver) { latch.countDown(); } @Override public void connectionFailed(final ActiveMQException me, boolean failedOver, String scaleDownTargetNodeID) { connectionFailed(me, failedOver); } @Override public void beforeReconnect(ActiveMQException exception) { System.out.println("MyListener.beforeReconnect"); } } for (ClientSession session : sessions) { session.addFailureListener(new MyListener()); } ClusterManager clusterManager = server.getClusterManager(); clusterManager.clear(); server.fail(true); // Wait to be informed of failure boolean ok = latch.await(10000, TimeUnit.MILLISECONDS); Assert.assertTrue(ok); }
protected void waitForTopology(final ActiveMQServer server, String clusterConnectionName, final int nodes, final long timeout) throws Exception { logger.debug("waiting for " + nodes + " on the topology for server = " + server); long start = System.currentTimeMillis(); ClusterConnection clusterConnection = server.getClusterManager().getClusterConnection(clusterConnectionName); Topology topology = clusterConnection.getTopology(); do { if (nodes == topology.getMembers().size()) { return; } Thread.sleep(10); } while (System.currentTimeMillis() - start < timeout); String msg = "Timed out waiting for cluster topology of " + nodes + " (received " + topology.getMembers().size() + ") topology = " + topology + ")"; ActiveMQServerLogger.LOGGER.error(msg); throw new Exception(msg); }
private static ActiveMQServer selectServer(HttpServerExchange exchange, ActiveMQServer rootServer) { String activemqServerName = exchange.getRequestHeaders().getFirst(TransportConstants.ACTIVEMQ_SERVER_NAME); if (activemqServerName == null) { return rootServer; } ClusterManager clusterManager = rootServer.getClusterManager(); if (clusterManager != null) { HAManager haManager = clusterManager.getHAManager(); if (haManager != null) { for (Map.Entry<String, ActiveMQServer> entry : haManager.getBackupServers().entrySet()) { if (entry.getKey().equals(activemqServerName)) { return entry.getValue(); } } } } if (activemqServerName.equals(rootServer.getConfiguration().getName())) { return rootServer; } else { return null; } }
public long scaleDown() throws Exception { ScaleDownHandler scaleDownHandler = new ScaleDownHandler(activeMQServer.getPagingManager(), activeMQServer.getPostOffice(), activeMQServer.getNodeManager(), activeMQServer.getClusterManager().getClusterController(), activeMQServer.getStorageManager()); ConcurrentMap<SimpleString, DuplicateIDCache> duplicateIDCaches = ((PostOfficeImpl) activeMQServer.getPostOffice()).getDuplicateIDCaches(); Map<SimpleString, List<Pair<byte[], Long>>> duplicateIDMap = new HashMap<>(); for (SimpleString address : duplicateIDCaches.keySet()) { DuplicateIDCache duplicateIDCache = activeMQServer.getPostOffice().getDuplicateIDCache(address); duplicateIDMap.put(address, duplicateIDCache.getMap()); } return scaleDownHandler.scaleDown(scaleDownClientSessionFactory, activeMQServer.getResourceManager(), duplicateIDMap, activeMQServer.getManagementService().getManagementAddress(), null); } }
@Override public CountDownLatch crash(boolean failover, boolean waitFailure, ClientSession... sessions) throws Exception { CountDownLatch latch = new CountDownLatch(sessions.length); CountDownSessionFailureListener[] listeners = new CountDownSessionFailureListener[sessions.length]; for (int i = 0; i < sessions.length; i++) { listeners[i] = new CountDownSessionFailureListener(latch, sessions[i]); sessions[i].addFailureListener(listeners[i]); } ClusterManager clusterManager = server.getClusterManager(); clusterManager.flushExecutor(); clusterManager.clear(); Assert.assertTrue("server should be running!", server.isStarted()); server.fail(failover); if (waitFailure) { // Wait to be informed of failure boolean ok = latch.await(10000, TimeUnit.MILLISECONDS); Assert.assertTrue("Failed to stop the server! Latch count is " + latch.getCount() + " out of " + sessions.length, ok); } return latch; }