Repository: incubator-brooklyn Updated Branches: refs/heads/master 5c9153e85 -> 4ea52475f
Adds CUSTOMIZE_LATCH to redis slaves, allowing async start Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0a66eb8e Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0a66eb8e Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0a66eb8e Branch: refs/heads/master Commit: 0a66eb8eeac7dbb03c3b2759138a65fbd7f1fc16 Parents: e92dd1e Author: Martin Harris <[email protected]> Authored: Wed Sep 9 13:34:58 2015 +0100 Committer: Martin Harris <[email protected]> Committed: Wed Sep 9 17:19:53 2015 +0100 ---------------------------------------------------------------------- .../entity/nosql/redis/RedisClusterImpl.java | 21 +++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0a66eb8e/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisClusterImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisClusterImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisClusterImpl.java index 92c7593..7e71b29 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisClusterImpl.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisClusterImpl.java @@ -23,15 +23,19 @@ import java.util.List; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.core.entity.AbstractEntity; +import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceIndicatorsFromChildrenAndMembers; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceProblemsLogic; +import org.apache.brooklyn.core.sensor.DependentConfiguration; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.enricher.stock.Enrichers; import org.apache.brooklyn.entity.group.DynamicCluster; +import org.apache.brooklyn.entity.software.base.SoftwareProcess; import org.apache.brooklyn.util.collections.QuorumCheck.QuorumChecks; import org.apache.brooklyn.util.exceptions.CompoundRuntimeException; import org.apache.brooklyn.util.exceptions.Exceptions; @@ -64,11 +68,12 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster { super.init(); RedisStore master = addChild(EntitySpec.create(RedisStore.class)); - setAttribute(MASTER, master); + sensors().set(MASTER, master); DynamicCluster slaves = addChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(RedisSlave.class).configure(RedisSlave.MASTER, master))); - setAttribute(SLAVES, slaves); + .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(RedisSlave.class).configure(RedisSlave.MASTER, master) + .configure(SoftwareProcess.CUSTOMIZE_LATCH, DependentConfiguration.attributeWhenReady(master, Attributes.SERVICE_UP)))); + sensors().set(SLAVES, slaves); addEnricher(Enrichers.builder() .propagating(RedisStore.HOSTNAME, RedisStore.ADDRESS, RedisStore.SUBNET_HOSTNAME, RedisStore.SUBNET_ADDRESS, RedisStore.REDIS_PORT) @@ -101,11 +106,13 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster { } private void doStart(Collection<? extends Location> locations) { - RedisStore master = getMaster(); - master.invoke(RedisStore.START, ImmutableMap.<String, Object>of("locations", ImmutableList.copyOf(locations))).getUnchecked(); + // Start the master and slaves asynchronously (the slave has a LAUNCH_LATCH on master to ensure it is available before the slaves are launched) + Task<Void> masterStartTask = getMaster().invoke(RedisStore.START, ImmutableMap.<String, Object>of("locations", ImmutableList.copyOf(locations))); + Task<Void> slaveStartTask = getSlaves().invoke(DynamicCluster.START, ImmutableMap.<String, Object>of("locations", ImmutableList.copyOf(locations))); - DynamicCluster slaves = getSlaves(); - slaves.invoke(DynamicCluster.START, ImmutableMap.<String, Object>of("locations", ImmutableList.copyOf(locations))).getUnchecked(); + // Wait for both master and slave to start before returning + masterStartTask.getUnchecked(); + slaveStartTask.getUnchecked(); } @Override
