@Override public void setHAPolicy(HAPolicy haPolicy) { if (logger.isTraceEnabled()) { logger.tracef("XXX @@@ Setting %s, isBackup=%s at %s", haPolicy, haPolicy.isBackup(), this); } this.haPolicy = haPolicy; }
@Override public boolean isBackup() { checkStarted(); clearIO(); try { return server.getHAPolicy().isBackup(); } finally { blockOnIO(); } }
/** * @throws ActiveMQException */ public void remoteFailOver(ReplicationLiveIsStoppingMessage.LiveStopping finalMessage) throws ActiveMQException { if (logger.isTraceEnabled()) { logger.trace("Remote fail-over, got message=" + finalMessage + ", backupUpToDate=" + backupUpToDate); } if (!activeMQServer.getHAPolicy().isBackup() || activeMQServer.getHAPolicy().isSharedStore()) { throw new ActiveMQInternalErrorException(); } if (!backupUpToDate) { failOver(null); } else { failOver(finalMessage); } }
@Override public void close(final boolean permanently, boolean restarting) throws Exception { synchronized (this) { if (backupQuorum != null) backupQuorum.causeExit(STOP); replicationEndpoint = null; closed = true; } //we have to check as the server policy may have changed if (activeMQServer.getHAPolicy().isBackup()) { // To avoid a NPE cause by the stop NodeManager nodeManagerInUse = activeMQServer.getNodeManager(); activeMQServer.interruptActivationThread(nodeManagerInUse); if (nodeManagerInUse != null) { nodeManagerInUse.stopBackup(); } } }
ActiveMQServerLogger.LOGGER.serverStarting((haPolicy.isBackup() ? "backup" : "live"), configuration); final boolean wasLive = !haPolicy.isBackup(); if (!haPolicy.isBackup()) { activation = haPolicy.createActivation(this, false, activationParams, shutdownOnCriticalIO); if (haPolicy.isBackup()) { if (haPolicy.isSharedStore()) { activation = haPolicy.createActivation(this, false, activationParams, shutdownOnCriticalIO);
private synchronized ReplicationEndpoint connectToReplicationEndpoint(final ClusterControl control) throws Exception { if (!activeMQServer.isStarted()) return null; if (!activeMQServer.getHAPolicy().isBackup()) { throw ActiveMQMessageBundle.BUNDLE.serverNotBackupServer(); } Channel replicationChannel = control.createReplicationChannel(); replicationChannel.setHandler(replicationEndpoint); if (replicationEndpoint.getChannel() != null) { throw ActiveMQMessageBundle.BUNDLE.alreadyHaveReplicationServer(); } replicationEndpoint.setChannel(replicationChannel); return replicationEndpoint; } }
@Override public synchronized void start() throws Exception { if (started) return; //deploy the backup connectors using the cluster configuration for (ClusterConnectionConfiguration config : configuration.getClusterConfigurations()) { deployBackupConnector(config); } //start each connector and if we are backup and shared store announce ourselves. NB with replication we don't do this //as we wait for replication to start and be notified by the replication manager. for (BackupConnector conn : backupConnectors) { conn.start(); if (server.getHAPolicy().isBackup() && server.getHAPolicy().isSharedStore()) { conn.informTopology(); conn.announceBackup(); } } started = true; }
protected void waitForServerToStart(ActiveMQServer server, boolean activation) throws InterruptedException { if (server == null) return; final long wait = 5000; long timetowait = System.currentTimeMillis() + wait; while (!server.isStarted() && System.currentTimeMillis() < timetowait) { Thread.sleep(50); } if (!server.isStarted()) { log.info(threadDump("Server didn't start")); fail("server didn't start: " + server); } if (activation) { if (!server.getHAPolicy().isBackup()) { if (!server.waitForActivation(wait, TimeUnit.MILLISECONDS)) fail("Server didn't initialize: " + server); } } }
@Override public void close(boolean permanently, boolean restarting) throws Exception { if (!restarting) { synchronized (failbackCheckerGuard) { cancelFailBackChecker = true; } } // To avoid a NPE cause by the stop NodeManager nodeManagerInUse = activeMQServer.getNodeManager(); //we need to check as the servers policy may have changed if (activeMQServer.getHAPolicy().isBackup()) { activeMQServer.interruptActivationThread(nodeManagerInUse); if (nodeManagerInUse != null) { nodeManagerInUse.stopBackup(); } } else { if (nodeManagerInUse != null) { // if we are now live, behave as live // We need to delete the file too, otherwise the backup will failover when we shutdown or if the backup is // started before the live if (sharedStoreSlavePolicy.isFailoverOnServerShutdown() || permanently) { nodeManagerInUse.crashLiveServer(); } else { nodeManagerInUse.pauseLiveServer(); } } } }
clusterManager = new ClusterManager(executorFactory, this, postOffice, scheduledPool, managementService, configuration, nodeManager, haPolicy.isBackup()); messagingServerControl = managementService.registerServer(postOffice, securityStore, storageManager, configuration, addressSettingsRepository, securityRepository, resourceManager, remotingService, this, queueFactory, scheduledPool, pagingManager, haPolicy.isBackup());
if (!backupServer.getServer().getHAPolicy().isBackup()) { toCrash.add(backupServer);
assertTrue("we assume 3 is a backup", servers[3].getHAPolicy().isBackup()); assertFalse("no shared storage", servers[3].getHAPolicy().isSharedStore()); assertFalse("3 should have failed over ", servers[3].getHAPolicy().isBackup()); assertFalse("4 should have failed over ", servers[4].getHAPolicy().isBackup());
assertFalse("must NOT be a backup", liveServer.getServer().getHAPolicy().isBackup()); adaptLiveConfigForReplicatedFailBack(liveServer); FileMoveManager liveMoveManager = new FileMoveManager(liveServer.getServer().getConfiguration().getJournalLocation(), -1); try { liveServer.start(); assertTrue("must have become a backup", liveServer.getServer().getHAPolicy().isBackup()); Assert.assertEquals(0, liveMoveManager.getNumberOfFolders()); } finally { liveServer.getServer().waitForActivation(10, TimeUnit.SECONDS); Assert.assertEquals(1, liveMoveManager.getNumberOfFolders()); assertTrue("must be active now", !liveServer.getServer().getHAPolicy().isBackup()); assertFalse("must be LIVE!", liveServer.getServer().getHAPolicy().isBackup()); int i = 0; while (!backupServer.isStarted() && i++ < 100) {
/** * Basic fail-back test. * * @throws Exception */ @Test public void testFailBack() throws Exception { ((SharedStoreSlavePolicy) backupServer.getServer().getHAPolicy()).setRestartBackup(false); createSessionFactory(); ClientSession session = sendAndConsume(sf, true); ClientProducer producer = session.createProducer(ADDRESS); sendMessages(session, producer, NUM_MESSAGES); session.commit(); crash(session); session.start(); ClientConsumer consumer = session.createConsumer(ADDRESS); receiveMessages(consumer, 0, NUM_MESSAGES, true); producer = session.createProducer(ADDRESS); sendMessages(session, producer, 2 * NUM_MESSAGES); session.commit(); assertFalse("must NOT be a backup", liveServer.getServer().getHAPolicy().isBackup()); adaptLiveConfigForReplicatedFailBack(liveServer); CountDownSessionFailureListener listener = new CountDownSessionFailureListener(session); session.addFailureListener(listener); liveServer.start(); assertTrue(listener.getLatch().await(5, TimeUnit.SECONDS)); assertTrue("live initialized after restart", liveServer.getServer().waitForActivation(15, TimeUnit.SECONDS)); session.start(); receiveMessages(consumer, 0, NUM_MESSAGES, true); }
assertTrue("we assume 3 is a backup", servers[3].getHAPolicy().isBackup()); assertFalse("no shared storage", servers[3].getHAPolicy().isSharedStore());
Assert.assertFalse("must NOT be a backup", liveServer.getServer().getHAPolicy().isBackup()); adaptLiveConfigForReplicatedFailBack(liveServer); beforeRestart(liveServer);