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
----------------------------------------------------------------------