Return-Path: X-Original-To: apmail-brooklyn-commits-archive@minotaur.apache.org Delivered-To: apmail-brooklyn-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id F0AAD10B41 for ; Tue, 27 May 2014 21:35:35 +0000 (UTC) Received: (qmail 85244 invoked by uid 500); 27 May 2014 21:35:35 -0000 Delivered-To: apmail-brooklyn-commits-archive@brooklyn.apache.org Received: (qmail 85221 invoked by uid 500); 27 May 2014 21:35:35 -0000 Mailing-List: contact commits-help@brooklyn.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.incubator.apache.org Delivered-To: mailing list commits@brooklyn.incubator.apache.org Received: (qmail 85207 invoked by uid 99); 27 May 2014 21:35:35 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 May 2014 21:35:35 +0000 X-ASF-Spam-Status: No, hits=-2000.7 required=5.0 tests=ALL_TRUSTED,RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO mail.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with SMTP; Tue, 27 May 2014 21:35:34 +0000 Received: (qmail 85025 invoked by uid 99); 27 May 2014 21:35:14 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 May 2014 21:35:14 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id DFE4732AE61; Tue, 27 May 2014 21:35:13 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: richard@apache.org To: commits@brooklyn.incubator.apache.org Date: Tue, 27 May 2014 21:35:16 -0000 Message-Id: <42246c84c18f49d4b7026b9681106b69@git.apache.org> In-Reply-To: <02b70e3c1fe94ad3a209d2c6e9ab99b0@git.apache.org> References: <02b70e3c1fe94ad3a209d2c6e9ab99b0@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: =?utf-8?q?=5B4/8=5D_git_commit=3A_AbstractController=E2=80=99s_mem?= =?utf-8?q?ber-tracking_policy_tidy?= X-Virus-Checked: Checked by ClamAV on apache.org AbstractController’s member-tracking policy tidy - in preparation for policy persistence - and same for nginx Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0bbb8f12 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0bbb8f12 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0bbb8f12 Branch: refs/heads/master Commit: 0bbb8f12ad0620ce640705b410e4ef5f67241621 Parents: 3a9e027 Author: Aled Sage Authored: Fri May 23 22:16:52 2014 +0100 Committer: Aled Sage Committed: Tue May 27 20:49:34 2014 +0100 ---------------------------------------------------------------------- .../entity/proxy/AbstractControllerImpl.java | 101 ++++++++++--------- .../entity/proxy/nginx/NginxControllerImpl.java | 33 ++++-- 2 files changed, 79 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0bbb8f12/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java index a615f67..c43e65a 100644 --- a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java +++ b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java @@ -29,6 +29,7 @@ import brooklyn.event.feed.ConfigToAttributes; import brooklyn.location.access.BrooklynAccessUtils; import brooklyn.management.Task; import brooklyn.mementos.EntityMemento; +import brooklyn.policy.PolicySpec; import brooklyn.util.collections.MutableMap; import brooklyn.util.guava.Maybe; import brooklyn.util.task.Tasks; @@ -82,17 +83,18 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme @Override public void init() { super.init(); - initServerPoolMemberTrackingPolicy(); - } - @Override - // TODO When persists policies, then can delete this code - protected void rebind() { - initServerPoolMemberTrackingPolicy(); - - super.rebind(); } - protected void initServerPoolMemberTrackingPolicy() { + protected void addServerPoolMemberTrackingPolicy() { + Group serverPool = getServerPool(); + if (serverPool == null) { + return; // no-op + } + if (serverPoolMemberTrackerPolicy != null) { + LOG.warn("Call to addServerPoolMemberTrackingPolicy when serverPoolMemberTrackingPolicy already exists, in {}", this); + removeServerPoolMemberTrackingPolicy(); + } + AttributeSensor hostAndPortSensor = getConfig(HOST_AND_PORT_SENSOR); AttributeSensor hostnameSensor = getConfig(HOSTNAME_SENSOR); AttributeSensor portSensor = getConfig(PORT_NUMBER_SENSOR); @@ -102,11 +104,44 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme } else { sensorsToTrack = ImmutableSet.>of(hostnameSensor, portSensor); } - Map policyFlags = MutableMap.of("name", "Controller targets tracker", - "sensorsToTrack", sensorsToTrack); - serverPoolMemberTrackerPolicy = new AbstractMembershipTrackingPolicy(policyFlags) { - @Override protected void onEntityEvent(EventType type, Entity entity) { onServerPoolMemberChanged(entity); } - }; + + serverPoolMemberTrackerPolicy = addPolicy(PolicySpec.create(ServerPoolMemberTrackerPolicy.class) + .displayName("Controller targets tracker") + .configure("group", serverPool) + .configure("sensorsToTrack", sensorsToTrack)); + + LOG.info("Added policy {} to {}", serverPoolMemberTrackerPolicy, this); + + // Initialize ourselves immediately with the latest set of members; don't wait for + // listener notifications because then will be out-of-date for short period (causing + // problems for rebind) + for (Entity member : getServerPool().getMembers()) { + if (belongsInServerPool(member)) { + if (LOG.isTraceEnabled()) LOG.trace("Done {} checkEntity {}", this, member); + String address = getAddressOfEntity(member); + serverPoolTargets.put(member, address); + if (address != null) { + serverPoolAddresses.add(address); + } + } + } + + LOG.info("Resetting {}, members {} with addresses {}", new Object[] {this, serverPoolTargets, serverPoolAddresses}); + setAttribute(SERVER_POOL_TARGETS, serverPoolAddresses); + } + + protected void removeServerPoolMemberTrackingPolicy() { + if (serverPoolMemberTrackerPolicy != null) { + removePolicy(serverPoolMemberTrackerPolicy); + } + } + + public static class ServerPoolMemberTrackerPolicy extends AbstractMembershipTrackingPolicy { + @Override + protected void onEntityEvent(EventType type, Entity entity) { + // relies on policy-rebind injecting the implementation rather than the dynamic-proxy + ((AbstractControllerImpl)super.entity).onServerPoolMemberChanged(entity); + } } /** @@ -124,8 +159,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme public void onManagementNoLongerMaster() { super.onManagementNoLongerMaster(); // TODO remove when deprecated method in parent removed isActive = false; - if (serverPoolMemberTrackerPolicy!=null) - serverPoolMemberTrackerPolicy.reset(); + removeServerPoolMemberTrackingPolicy(); } private Group getServerPool() { @@ -250,11 +284,10 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme @Override protected void connectSensors() { super.connectSensors(); - LOG.info("Adding policy {} to {}, during start", serverPoolMemberTrackerPolicy, this); - addPolicy(serverPoolMemberTrackerPolicy); if (getUrl()==null) setAttribute(ROOT_URL, inferUrl()); - resetServerPoolMemberTrackerPolicy(); + // TODO when rebind policies, and rebind calls connectSensors, then this will cause problems + addServerPoolMemberTrackingPolicy(); } @Override @@ -277,8 +310,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme @Override protected void preStop() { super.preStop(); - if (serverPoolMemberTrackerPolicy!=null) - serverPoolMemberTrackerPolicy.reset(); + removeServerPoolMemberTrackingPolicy(); } /** @@ -322,33 +354,6 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme return result; } - protected synchronized void resetServerPoolMemberTrackerPolicy() { - serverPoolMemberTrackerPolicy.reset(); - serverPoolAddresses.clear(); - serverPoolTargets.clear(); - if (groovyTruth(getServerPool())) { - serverPoolMemberTrackerPolicy.setGroup(getServerPool()); - - // Initialize ourselves immediately with the latest set of members; don't wait for - // listener notifications because then will be out-of-date for short period (causing - // problems for rebind) - for (Entity member : getServerPool().getMembers()) { - if (belongsInServerPool(member)) { - if (LOG.isTraceEnabled()) LOG.trace("Done {} checkEntity {}", this, member); - String address = getAddressOfEntity(member); - serverPoolTargets.put(member, address); - if (address != null) { - serverPoolAddresses.add(address); - } - } - } - - LOG.info("Resetting {}, members {} with address {}", new Object[] {this, serverPoolTargets, serverPoolAddresses}); - } - - setAttribute(SERVER_POOL_TARGETS, serverPoolAddresses); - } - protected synchronized void onServerPoolMemberChanged(Entity member) { if (LOG.isTraceEnabled()) LOG.trace("For {}, considering membership of {} which is in locations {}", new Object[] {this, member, member.getLocations()}); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0bbb8f12/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java index 6088b13..6246485 100644 --- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java +++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java @@ -35,6 +35,7 @@ import brooklyn.event.SensorEventListener; import brooklyn.event.feed.ConfigToAttributes; import brooklyn.event.feed.http.HttpFeed; import brooklyn.event.feed.http.HttpPollConfig; +import brooklyn.policy.PolicySpec; import brooklyn.util.ResourceUtils; import brooklyn.util.file.ArchiveUtils; import brooklyn.util.http.HttpToolResponse; @@ -56,6 +57,7 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx private volatile HttpFeed httpFeed; private final Set installedKeysCache = Sets.newLinkedHashSet(); + private UrlMappingsMemberTrackerPolicy urlMappingsMemberTrackerPolicy; @Override public void reload() { @@ -68,6 +70,7 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx driver.reload(); } + @Override public boolean isSticky() { return getConfig(STICKY); } @@ -110,18 +113,34 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx }); // Listen to url-mappings being added and removed - AbstractMembershipTrackingPolicy policy = new AbstractMembershipTrackingPolicy() { - @Override protected void onEntityEvent(EventType type, Entity entity) { updateNeeded(); } - }; - addPolicy(policy); - policy.setGroup(urlMappings); + urlMappingsMemberTrackerPolicy = addPolicy(PolicySpec.create(UrlMappingsMemberTrackerPolicy.class) + .configure("group", urlMappings)); + } + } + + protected void removeUrlMappingsMemberTrackerPolicy() { + if (urlMappingsMemberTrackerPolicy != null) { + removePolicy(urlMappingsMemberTrackerPolicy); + } + } + + public static class UrlMappingsMemberTrackerPolicy extends AbstractMembershipTrackingPolicy { + @Override + protected void onEntityEvent(EventType type, Entity entity) { + // relies on policy-rebind injecting the implementation rather than the dynamic-proxy + ((NginxControllerImpl)super.entity).updateNeeded(); } } @Override + protected void preStop() { + super.preStop(); + removeUrlMappingsMemberTrackerPolicy(); + } + + @Override protected void doStop() { - // TODO Want http.poll to set SERVICE_UP to false on IOException. How? - // And don't want stop to race with the last poll. + // TODO don't want stop to race with the last poll. super.doStop(); setAttribute(SERVICE_UP, false); }