You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2018/06/05 08:44:32 UTC

[1/5] brooklyn-server git commit: Machine metrics: mark as non-persisted

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 6f093c71f -> baad0c039


Machine metrics: mark as non-persisted

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

Branch: refs/heads/master
Commit: 01a5f197c8246df3d43073b55bc45ba60d9f00d5
Parents: cc6133f
Author: Aled Sage <al...@gmail.com>
Authored: Thu May 24 15:54:03 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 21:54:52 2018 +0100

----------------------------------------------------------------------
 .../entity/machine/MachineAttributes.java       | 70 +++++++++++++++-----
 1 file changed, 55 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/01a5f197/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineAttributes.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineAttributes.java b/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineAttributes.java
index fc852b6..cec14df 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineAttributes.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineAttributes.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.core.config.render.RendererHints;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.util.guava.Functionals;
@@ -43,21 +44,60 @@ public class MachineAttributes {
      * Sensor attributes for machines.
      */
 
-    public static final AttributeSensor<Duration> UPTIME = Sensors.newSensor(Duration.class, "machine.uptime", "Current uptime");
-    public static final AttributeSensor<Double> LOAD_AVERAGE = Sensors.newDoubleSensor("machine.loadAverage", "Current load average");
-
-    public static final AttributeSensor<Double> CPU_USAGE = Sensors.newDoubleSensor("machine.cpu", "Current CPU usage");
-    public static final AttributeSensor<Double> AVERAGE_CPU_USAGE = Sensors.newDoubleSensor("cpu.average", "Average CPU usage across the cluster");
-
-    public static final AttributeSensor<Long> FREE_MEMORY = Sensors.newLongSensor("machine.memory.free", "Current free memory");
-    public static final AttributeSensor<Long> TOTAL_MEMORY = Sensors.newLongSensor("machine.memory.total", "Total memory");
-    public static final AttributeSensor<Long> USED_MEMORY = Sensors.newLongSensor("machine.memory.used", "Current memory usage");
-
-    public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_LAST = Sensors.newDoubleSensor("memory.used.delta", "Change in memory usage per second");
-    public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_IN_WINDOW = Sensors.newDoubleSensor("memory.used.windowed", "Average change in memory usage over 30s");
-
-    public static final AttributeSensor<Double> USED_MEMORY_PERCENT = Sensors.newDoubleSensor("memory.used.percent", "The percentage of memory used");
-    public static final AttributeSensor<Double> AVERAGE_USED_MEMORY_PERCENT = Sensors.newDoubleSensor("memory.used.percent.average", "Average percentage of memory used across the cluster");
+    public static final AttributeSensor<Duration> UPTIME = Sensors.builder(Duration.class, "machine.uptime")
+            .description("Current uptime")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> LOAD_AVERAGE = Sensors.builder(Double.class, "machine.loadAverage")
+            .description("Current load average")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> CPU_USAGE = Sensors.builder(Double.class, "machine.cpu")
+            .description("Current CPU usage")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> AVERAGE_CPU_USAGE = Sensors.builder(Double.class, "cpu.average")
+            .description("Average CPU usage across the cluster")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Long> FREE_MEMORY = Sensors.builder(Long.class, "machine.memory.free")
+            .description("Current free memory")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Long> TOTAL_MEMORY = Sensors.builder(Long.class, "machine.memory.total")
+            .description("Total memory")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Long> USED_MEMORY = Sensors.builder(Long.class, "machine.memory.used")
+            .description("Current memory usage")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_LAST = Sensors.builder(Double.class, "memory.used.delta")
+            .description("Change in memory usage per second")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+    
+    public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_IN_WINDOW = Sensors.builder(Double.class, "memory.used.windowed")
+            .description("Average change in memory usage over 30s")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> USED_MEMORY_PERCENT = Sensors.builder(Double.class, "memory.used.percent")
+            .description("The percentage of memory used")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
+
+    public static final AttributeSensor<Double> AVERAGE_USED_MEMORY_PERCENT = Sensors.builder(Double.class, "memory.used.percent.average")
+            .description("Average percentage of memory used across the cluster")
+            .persistence(SensorPersistenceMode.NONE)
+            .build();
 
     private static AtomicBoolean initialized = new AtomicBoolean(false);
 


[2/5] brooklyn-server git commit: Attributes with PersistenceMode.NONE: don’t re-persist

Posted by al...@apache.org.
Attributes with PersistenceMode.NONE: don’t re-persist


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

Branch: refs/heads/master
Commit: cc6133f83772deda532ae0bed7f5130e00230a0a
Parents: 68d88eb
Author: Aled Sage <al...@gmail.com>
Authored: Thu May 24 15:53:33 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 21:54:52 2018 +0100

----------------------------------------------------------------------
 .../core/mgmt/internal/EntityManagementSupport.java    |  8 ++++----
 .../brooklyn/core/mgmt/rebind/RebindEntityTest.java    | 13 +++++++++++++
 2 files changed, 17 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/cc6133f8/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
index e192edd..4a5c23b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
@@ -34,6 +34,7 @@ import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.Entities;
@@ -467,10 +468,9 @@ public class EntityManagementSupport {
         }
         @Override
         public void onAttributeChanged(AttributeSensor<?> attribute) {
-            // TODO Could make this more efficient by inspecting the attribute to decide if needs persisted
-            // immediately, or not important, or transient (e.g. do we really need to persist 
-            // request-per-second count for rebind purposes?!)
-            getManagementContext().getRebindManager().getChangeListener().onChanged(entity);
+            if (attribute.getPersistenceMode() != SensorPersistenceMode.NONE) {
+                getManagementContext().getRebindManager().getChangeListener().onChanged(entity);
+            }
         }
         @Override
         public void onConfigChanged(ConfigKey<?> key) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/cc6133f8/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
index ff3b703..71f4018 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
@@ -757,6 +757,19 @@ public class RebindEntityTest extends RebindTestFixtureWithApp {
         assertFalse(newE.isRebinding());
     }
     
+    @Test
+    public void testDoNotRepersistOnTransientAttributeChanged() throws Exception {
+        final AttributeSensor<String> MY_TRANSIENT_ATTRIBUTE = Sensors.builder(String.class, "myTransientAttribute")
+                .persistence(SensorPersistenceMode.NONE)
+                .build();
+        
+        RebindTestUtils.waitForPersisted(mgmt());
+        assertFalse(RebindTestUtils.hasPendingPersists(mgmt()));
+
+        origApp.sensors().set(MY_TRANSIENT_ATTRIBUTE, "myval");
+        assertFalse(RebindTestUtils.hasPendingPersists(mgmt()));
+    }
+    
     @ImplementedBy(EntityChecksIsRebindingImpl.class)
     public static interface EntityChecksIsRebinding extends TestEntity {
         boolean isRebindingValWhenRebinding();


[4/5] brooklyn-server git commit: Set attributes with value unchanged: don’t re-persist

Posted by al...@apache.org.
Set attributes with value unchanged: don’t re-persist

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

Branch: refs/heads/master
Commit: 62d7b967c49f35f45e97c8f6a650afdbc4f5a094
Parents: 01a5f19
Author: Aled Sage <al...@gmail.com>
Authored: Thu May 24 22:00:31 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 22:00:31 2018 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/core/entity/AbstractEntity.java  |  5 ++++-
 .../brooklyn/core/mgmt/rebind/RebindEntityTest.java      | 11 +++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/62d7b967/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
index bb561bd..53630d9 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
@@ -974,7 +974,10 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
                 entityType.addSensorIfAbsent(attribute);
             }
             
-            getManagementSupport().getEntityChangeListener().onAttributeChanged(attribute);
+            if (!Objects.equal(result, val)) {
+                getManagementSupport().getEntityChangeListener().onAttributeChanged(attribute);
+            }
+            
             return result;
         }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/62d7b967/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
index 71f4018..8b58f58 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindEntityTest.java
@@ -770,6 +770,17 @@ public class RebindEntityTest extends RebindTestFixtureWithApp {
         assertFalse(RebindTestUtils.hasPendingPersists(mgmt()));
     }
     
+    @Test
+    public void testDoNotRepersistOnSetAttributeWithSameValue() throws Exception {
+        final AttributeSensor<String> MY_ATTRIBUTE = Sensors.builder(String.class, "myAttribute").build();
+        
+        origApp.sensors().set(MY_ATTRIBUTE, "myval");
+        RebindTestUtils.waitForPersisted(mgmt());
+        
+        origApp.sensors().set(MY_ATTRIBUTE, "myval");
+        assertFalse(RebindTestUtils.hasPendingPersists(mgmt()));
+    }
+    
     @ImplementedBy(EntityChecksIsRebindingImpl.class)
     public static interface EntityChecksIsRebinding extends TestEntity {
         boolean isRebindingValWhenRebinding();


[3/5] brooklyn-server git commit: For tests, support RebindManager.hasPending()

Posted by al...@apache.org.
For tests, support RebindManager.hasPending()

Similar concept to waitForPendingComplete().


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

Branch: refs/heads/master
Commit: 68d88ebde64ca03a2c808723a6a32df8c2e443c6
Parents: dedaffd
Author: Aled Sage <al...@gmail.com>
Authored: Thu May 24 21:49:27 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 21:54:52 2018 +0100

----------------------------------------------------------------------
 .../brooklyn/api/mgmt/rebind/RebindManager.java |  6 +++++
 .../mementos/BrooklynMementoPersister.java      |  3 +++
 .../NonDeploymentManagementContext.java         |  4 +++
 .../BrooklynMementoPersisterToObjectStore.java  | 27 ++++++++++++++++++++
 .../mgmt/persist/PersistenceObjectStore.java    |  7 +++++
 .../persist/StoreObjectAccessorLocking.java     | 15 +++++++++++
 .../rebind/PeriodicDeltaChangeListener.java     | 22 ++++++++++++++++
 .../core/mgmt/rebind/RebindManagerImpl.java     |  7 +++++
 .../core/mgmt/rebind/RebindTestUtils.java       |  4 +++
 9 files changed, 95 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindManager.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindManager.java
index 9dcda12..c702837 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindManager.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindManager.java
@@ -113,6 +113,12 @@ public interface RebindManager {
     /** waits for any needed or pending writes to complete */
     public void waitForPendingComplete(Duration duration, boolean canTrigger) throws InterruptedException, TimeoutException;
 
+    @VisibleForTesting
+    /**
+     * whether there are any needed or pending writes.
+     */
+    public boolean hasPending();
+
     /** Forcibly performs persistence, in the foreground, either full (all entities) or incremental;
      * if no exception handler specified, the default one from the persister is used.
      * <p>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
index 8cf00b8..14793fb 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
@@ -111,6 +111,9 @@ public interface BrooklynMementoPersister {
     @VisibleForTesting
     void waitForWritesCompleted(Duration timeout) throws InterruptedException, TimeoutException;
 
+    @VisibleForTesting
+    public boolean isWriting();
+
     String getBackingStoreDescription();
     
     /** All methods on this interface are unmodifiable by the caller. Sub-interfaces may introduce modifiers. */

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
index 9c9d366..d517513 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
@@ -612,6 +612,10 @@ public class NonDeploymentManagementContext implements ManagementContextInternal
             throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
         }
         @Override
+        public boolean hasPending() {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+        @Override
         public void forcePersistNow(boolean full, PersistenceExceptionHandler exceptionHandler) {
             throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
index 260e2e2..aab8777 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
@@ -758,6 +758,33 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         }
     }
 
+    @Override
+    public boolean isWriting() {
+        boolean locked;
+        try {
+            locked = lock.readLock().tryLock(0, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            throw Exceptions.propagate(e);
+        }
+        if (locked) {
+            ImmutableSet<StoreObjectAccessorWithLock> wc;
+            synchronized (writers) {
+                wc = ImmutableSet.copyOf(writers.values());
+            }
+            lock.readLock().unlock();
+            
+            for (StoreObjectAccessorWithLock writer : wc) {
+                if (writer.isWriting()) {
+                    return true;
+                }
+            }
+            
+            return false;
+        } else {
+            return true;
+        }
+    }
+
     private String read(String subPath) {
         StoreObjectAccessor objectAccessor = objectStore.newAccessor(subPath);
         return objectAccessor.get();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/PersistenceObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/PersistenceObjectStore.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/PersistenceObjectStore.java
index 18a5b64..cbb046b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/PersistenceObjectStore.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/PersistenceObjectStore.java
@@ -28,6 +28,7 @@ import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode;
 import org.apache.brooklyn.util.time.Duration;
 
 import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.io.ByteSource;
 
 /**
@@ -60,6 +61,12 @@ public interface PersistenceObjectStore {
          * and ensure they subsequently <code>unlock()</code> it of course. see {@link #getLockObject()}. */
         void waitForCurrentWrites(Duration timeout) throws InterruptedException, TimeoutException;
         
+        /**
+         * Whether there are any scheduled write lock operations, either queued or executing.
+         */
+        @VisibleForTesting
+        boolean isWriting();
+        
         /** returns the underlying lock in case callers need more complex synchronization control */ 
         ReadWriteLock getLockObject();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/StoreObjectAccessorLocking.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/StoreObjectAccessorLocking.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/StoreObjectAccessorLocking.java
index 49de188..ac4383b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/StoreObjectAccessorLocking.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/StoreObjectAccessorLocking.java
@@ -226,6 +226,21 @@ public class StoreObjectAccessorLocking implements PersistenceObjectStore.StoreO
     }
     
     @Override
+    public boolean isWriting() {
+        try {
+            boolean locked = lock.readLock().tryLock(0, TimeUnit.MILLISECONDS);
+            if (locked) {
+                lock.readLock().unlock();
+                return false;
+            } else {
+                return true;
+            }
+        } catch (InterruptedException e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+    
+    @Override
     public Date getLastModifiedDate() {
         return delegate.getLastModifiedDate();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
index e4b2d7d..1a971b6 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
@@ -338,6 +338,28 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
         }
     }
 
+    /** Check if there are any pending changes. May block to get mutex when checking. */
+    @VisibleForTesting
+    public boolean hasPending() {
+        if (!isActive() && state != ListenerState.STOPPING) return false;
+        
+        // if can't get mutex, then some changes are being applied.
+        try {
+            if (persistingMutex.tryAcquire(0, TimeUnit.MILLISECONDS)) {
+                try {
+                    // now no one else is writing
+                    return !deltaCollector.isEmpty();
+                } finally {
+                    persistingMutex.release();
+                }
+            } else {
+                return false;
+            }
+        } catch (InterruptedException e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
     /**
      * Indicates whether persistence is active. 
      * Even when not active, changes will still be tracked unless {@link #isStopped()}.

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
index 20e8f2a..53d5d6a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
@@ -460,6 +460,13 @@ public class RebindManagerImpl implements RebindManager {
 
     @Override
     @VisibleForTesting
+    public boolean hasPending()  {
+        if (persistenceStoreAccess == null || !persistenceRunning) return false;
+        return persistenceRealChangeListener.hasPending() || persistenceStoreAccess.isWriting();
+    }
+
+    @Override
+    @VisibleForTesting
     public void forcePersistNow(boolean full, PersistenceExceptionHandler exceptionHandler) {
         if (persistenceStoreAccess == null || persistenceRealChangeListener == null) {
             LOG.info("Skipping forced persist; no persistence mechanism available");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/68d88ebd/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
index 607631d..4107735 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
@@ -443,6 +443,10 @@ public class RebindTestUtils {
         managementContext.getRebindManager().waitForPendingComplete(TIMEOUT, true);
     }
 
+    public static boolean hasPendingPersists(ManagementContext managementContext) {
+        return managementContext.getRebindManager().hasPending();
+    }
+
     public static void stopPersistence(Application origApp) throws InterruptedException, TimeoutException {
         stopPersistence(origApp.getManagementContext());
     }


[5/5] brooklyn-server git commit: This closes #966

Posted by al...@apache.org.
This closes #966


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

Branch: refs/heads/master
Commit: baad0c03930d61d271d37a831990b19fd0ee4fb5
Parents: 6f093c7 62d7b96
Author: Aled Sage <al...@gmail.com>
Authored: Tue Jun 5 09:43:13 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Jun 5 09:43:13 2018 +0100

----------------------------------------------------------------------
 .../brooklyn/api/mgmt/rebind/RebindManager.java |  6 ++
 .../mementos/BrooklynMementoPersister.java      |  3 +
 .../brooklyn/core/entity/AbstractEntity.java    |  5 +-
 .../mgmt/internal/EntityManagementSupport.java  |  8 +--
 .../NonDeploymentManagementContext.java         |  4 ++
 .../BrooklynMementoPersisterToObjectStore.java  | 27 ++++++++
 .../mgmt/persist/PersistenceObjectStore.java    |  7 ++
 .../persist/StoreObjectAccessorLocking.java     | 15 +++++
 .../rebind/PeriodicDeltaChangeListener.java     | 22 ++++++
 .../core/mgmt/rebind/RebindManagerImpl.java     |  7 ++
 .../core/mgmt/rebind/RebindEntityTest.java      | 24 +++++++
 .../core/mgmt/rebind/RebindTestUtils.java       |  4 ++
 .../entity/machine/MachineAttributes.java       | 70 +++++++++++++++-----
 13 files changed, 182 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/baad0c03/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------