You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/11/19 18:47:58 UTC

[03/13] incubator-brooklyn git commit: clean up logic for HA start+change mode

clean up logic for HA start+change mode


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b0bb61ab
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b0bb61ab
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b0bb61ab

Branch: refs/heads/master
Commit: b0bb61abee4d8ad187dee56c746be233c6ad5111
Parents: 6127a75
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 18 19:40:51 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Nov 19 13:53:07 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/rebind/RebindManager.java    |  4 ++--
 .../entity/rebind/RebindManagerImpl.java         |  6 ++++--
 .../management/entitlement/Entitlements.java     |  8 ++++++--
 .../ha/HighAvailabilityManagerImpl.java          | 19 +++++++++++++------
 .../brooklyn/management/ha/HotStandbyTest.java   |  6 ++----
 5 files changed, 27 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0bb61ab/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
index 8f34c5a..556c6bc 100644
--- a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
+++ b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
@@ -113,8 +113,8 @@ public interface RebindManager {
     @VisibleForTesting
     public void waitForPendingComplete(Duration duration) throws InterruptedException, TimeoutException;
     /** Forcibly performs persistence, in the foreground 
-     * @deprecated since 0.7.0; use {@link #forcePersistNow(boolean)}, 
-     * default parameter here is false to mean incremental, with  */
+     * @deprecated since 0.7.0; use {@link #forcePersistNow(boolean, PersistenceExceptionHandler)}, 
+     * default parameter here is false to mean incremental, with null/default exception handler */
     @VisibleForTesting
     public void forcePersistNow();
     /** Forcibly performs persistence, in the foreground, either full (all entities) or incremental;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0bb61ab/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 1319caa..2a282b0 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -331,7 +331,7 @@ public class RebindManagerImpl implements RebindManager {
         try {
             rebind(null, null, mode);
         } catch (Exception e) {
-            Exceptions.propagate(e);
+            throw Exceptions.propagate(e);
         }
         
         Callable<Task<?>> taskFactory = new Callable<Task<?>>() {
@@ -340,7 +340,6 @@ public class RebindManagerImpl implements RebindManager {
                     public Void call() {
                         try {
                             rebind(null, null, mode);
-                            readOnlyRebindCount++;
                             return null;
                         } catch (RuntimeInterruptedException e) {
                             LOG.debug("Interrupted rebinding (re-interrupting): "+e);
@@ -540,6 +539,9 @@ public class RebindManagerImpl implements RebindManager {
             rebindActive.acquire();
         } catch (InterruptedException e1) { Exceptions.propagate(e1); }
         RebindTracker.setRebinding();
+        if (ManagementNodeState.isHotProxy(mode))
+            readOnlyRebindCount++;
+
         Stopwatch timer = Stopwatch.createStarted();
         try {
             Reflections reflections = new Reflections(classLoader);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0bb61ab/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/entitlement/Entitlements.java b/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
index e8652a4..a555cac 100644
--- a/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
+++ b/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
@@ -301,11 +301,15 @@ public class Entitlements {
         if ("minimal".equalsIgnoreCase(type)) return new PerUserEntitlementManagerWithDefault(minimal());
         if (Strings.isNonBlank(type)) {
             try {
-                Class<?> clazz = ((ManagementContextInternal)mgmt).getBaseClassLoader().loadClass(type);
+                ClassLoader cl = ((ManagementContextInternal)mgmt).getBaseClassLoader();
+                if (cl==null) cl = Entitlements.class.getClassLoader();
+                Class<?> clazz = cl.loadClass(type);
                 Optional<?> result = Reflections.invokeConstructorWithArgs(clazz, brooklynProperties);
                 if (result.isPresent()) return (EntitlementManager) result.get();
                 return (EntitlementManager) clazz.newInstance();
-            } catch (Exception e) { throw Exceptions.propagate(e); }
+            } catch (Exception e) { 
+                throw Exceptions.propagate(e); 
+            }
         }
         throw new IllegalStateException("Invalid entitlement manager specified: '"+type+"'");
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0bb61ab/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java b/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
index 77636d0..31ec5b1 100644
--- a/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
+++ b/core/src/main/java/brooklyn/management/ha/HighAvailabilityManagerImpl.java
@@ -241,9 +241,6 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
     @Override
     public void start(HighAvailabilityMode startMode) {
         nodeStateTransitionComplete = true;
-        // always start in standby, unless hot backup; it may get promoted to master or hot_standby in this method
-        // (depending on startMode; but for startMode STANDBY or HOT_STANDBY it will not promote until the next election)
-        setInternalNodeState(startMode==HighAvailabilityMode.HOT_BACKUP ? ManagementNodeState.HOT_BACKUP : ManagementNodeState.STANDBY);
         disabled = false;
         running = true;
         changeMode(startMode, true, true);
@@ -264,8 +261,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
         }
         if (getNodeState()==ManagementNodeState.FAILED || getNodeState()==ManagementNodeState.INITIALIZING) {
             if (startMode!=HighAvailabilityMode.DISABLED) {
-                // if coming from FAILED (or INITIALIZING because we skipped start call) then treat as cold standby
-                setInternalNodeState(ManagementNodeState.STANDBY);
+                // if coming from FAILED (or INITIALIZING because we skipped start call) then treat as initializing
+                setInternalNodeState(ManagementNodeState.INITIALIZING);
             }
         }
         
@@ -303,6 +300,9 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
         switch (startMode) {
         case AUTO:
             // don't care; let's start and see if we promote ourselves
+            if (getInternalNodeState()==ManagementNodeState.INITIALIZING) {
+                setInternalNodeState(ManagementNodeState.STANDBY);
+            }
             publishAndCheck(true);
             switch (getInternalNodeState()) {
             case HOT_BACKUP:
@@ -312,6 +312,11 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
                 startMode = HighAvailabilityMode.HOT_STANDBY;
             case HOT_STANDBY:
             case STANDBY:
+                if (getInternalNodeState()==ManagementNodeState.STANDBY && oldState==ManagementNodeState.INITIALIZING
+                        && BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_DEFAULT_STANDBY_IS_HOT_PROPERTY)) {
+                    // auto requested; not promoted; so it should become hot standby
+                    setInternalNodeState(ManagementNodeState.HOT_STANDBY);
+                }
                 ManagementPlaneSyncRecord newState = loadManagementPlaneSyncRecord(true);
                 String masterNodeId = newState.getMasterNodeId();
                 ManagementNodeSyncRecord masterNodeDetails = newState.getManagementNodes().get(masterNodeId);
@@ -676,6 +681,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
         ManagementNodeSyncRecord ownNodeRecord = memento.getManagementNodes().get(ownNodeId);
         
         ManagementNodeSyncRecord newMasterNodeRecord = null;
+        boolean weWereMaster = getNodeState()==ManagementNodeState.MASTER;
         boolean demotingSelfInFavourOfOtherMaster = false;
         
         if (currMasterNodeRecord != null && currMasterNodeRecord.getStatus() == ManagementNodeState.MASTER && isHeartbeatOk(currMasterNodeRecord, ownNodeRecord)) {
@@ -759,7 +765,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
                     (weAreNewMaster ? "us " : "")
                     + newMasterNodeId + " (" + timestampString(newMasterNodeRecord.getRemoteTimestamp()) + ")" 
                     + (newMasterNodeUri!=null ? " "+newMasterNodeUri : "")  );
-            LOG.warn(message);
+            if (weWereMaster || weAreNewMaster) LOG.info(message);
+            else LOG.debug(message);
         }
 
         // New master is ourself: promote

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0bb61ab/core/src/test/java/brooklyn/management/ha/HotStandbyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/ha/HotStandbyTest.java b/core/src/test/java/brooklyn/management/ha/HotStandbyTest.java
index f82afe8..d76faeb 100644
--- a/core/src/test/java/brooklyn/management/ha/HotStandbyTest.java
+++ b/core/src/test/java/brooklyn/management/ha/HotStandbyTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
 import java.util.ArrayDeque;
-import java.util.Collection;
 import java.util.Date;
 import java.util.Deque;
 import java.util.List;
@@ -42,9 +41,8 @@ import brooklyn.entity.Feed;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.rebind.PersistenceExceptionHandlerImpl;
-import brooklyn.entity.rebind.RebindFeedTest;
-import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.entity.rebind.RebindFeedTest.MyEntityWithFunctionFeedImpl;
+import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore;
 import brooklyn.entity.rebind.persister.InMemoryObjectStore;
 import brooklyn.entity.rebind.persister.ListeningObjectStore;
@@ -185,7 +183,7 @@ public class HotStandbyTest {
     }
 
     protected void forcePersistNow(HaMgmtNode n1) {
-        n1.mgmt.getRebindManager().forcePersistNow();
+        n1.mgmt.getRebindManager().forcePersistNow(false, null);
     }
     
     private Application expectRebindSequenceNumber(HaMgmtNode master, HaMgmtNode hotStandby, Application app, int expectedSensorSequenceValue, boolean immediate) {