You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/08/01 17:46:12 UTC

[19/21] incubator-brooklyn git commit: Delete deprecated MemberFailureDetectionPolicy

Delete deprecated MemberFailureDetectionPolicy


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

Branch: refs/heads/master
Commit: d9715b4269cdd2452607edf26ddb706acfda32ef
Parents: 0851637
Author: Aled Sage <al...@gmail.com>
Authored: Wed Jul 29 17:24:03 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sat Aug 1 00:16:52 2015 +0100

----------------------------------------------------------------------
 .../policy/ha/MemberFailureDetectionPolicy.java | 224 ---------------
 .../ha/MemberFailureDetectionPolicyTest.java    | 271 -------------------
 2 files changed, 495 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d9715b42/policy/src/main/java/brooklyn/policy/ha/MemberFailureDetectionPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/ha/MemberFailureDetectionPolicy.java b/policy/src/main/java/brooklyn/policy/ha/MemberFailureDetectionPolicy.java
deleted file mode 100644
index 5a6fa0a..0000000
--- a/policy/src/main/java/brooklyn/policy/ha/MemberFailureDetectionPolicy.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.policy.ha;
-
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.Entity;
-import brooklyn.entity.Group;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.entity.trait.Changeable;
-import brooklyn.entity.trait.Startable;
-import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.policy.basic.AbstractPolicy;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.flags.SetFromFlag;
-import brooklyn.util.time.Time;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Maps;
-import com.google.common.reflect.TypeToken;
-
-/**
- * Detects when members of a group have failed/recovered, and emits ENTITY_FAILED or 
- * ENTITY_RECOVERED accordingly.
- * 
- * This policy should be associated with a group to monitor its members:
- * <pre>
- * {@code
- *     group.addPolicy(new MemberFailureDetectionPolicy(...));
- * }
- * </pre>
- * 
- * Basic "failure" is defined as the service being "running" but isUp having flipped from 
- * true to false. 
- * 
- * These criteria can be further configured using "onlyReportIfPreviouslyUp" and
- * "useServiceStateRunning".
- * 
- * @author aled
- * 
- * @deprecated since 0.7.0; use {@link ServiceFailureDetector} associated with each member instead.
- */
-public class MemberFailureDetectionPolicy extends AbstractPolicy {
-
-    // TODO Remove duplication between this and ServiceFailureDetection.
-    // This could be re-written to use the latter. Or we could even deprecate
-    // this in favour of the latter.
-    // 
-    // Tricky to use ServiceFailureDetector: obvious thing would be to create a ServiceFailureDetector
-    // on memberAdded, and let do the hard work. But policy.setEntity(...) wants an EntityLocal
-    // whereas the member here could be remote.
-    
-    private static final Logger LOG = LoggerFactory.getLogger(MemberFailureDetectionPolicy.class);
-
-    @SetFromFlag("onlyReportIfPreviouslyUp")
-    public static final ConfigKey<Boolean> ONLY_REPORT_IF_PREVIOUSLY_UP = ConfigKeys.newBooleanConfigKey("onlyReportIfPreviouslyUp", "", true);
-    
-    @SetFromFlag("useServiceStateRunning")
-    public static final ConfigKey<Boolean> USE_SERVICE_STATE_RUNNING = ConfigKeys.newBooleanConfigKey("useServiceStateRunning", "", true);
-
-    @SuppressWarnings("serial")
-    @SetFromFlag("memberFilter")
-    public static final ConfigKey<Predicate<? super Entity>> MEMBER_FILTER = ConfigKeys.newConfigKey(new TypeToken<Predicate<? super Entity>>() {}, "memberFilter", "", Predicates.<Entity>alwaysTrue());
-    
-    private final Map<Entity, Long> memberFailures = Maps.newLinkedHashMap();
-    private final Map<Entity, Long> memberLastUps = Maps.newLinkedHashMap();
-    private final Map<Entity, Boolean> memberIsUps = Maps.newLinkedHashMap();
-    private final Map<Entity, Lifecycle> memberStates = Maps.newLinkedHashMap();
-
-    public MemberFailureDetectionPolicy() {
-        this(MutableMap.<String,Object>of());
-    }
-    
-    public MemberFailureDetectionPolicy(Map<String,?> flags) {
-        super(flags);
-    }
-    
-    protected boolean acceptsMember(Entity member) {
-        return getConfig(MEMBER_FILTER).apply(member);
-    }
-    
-    @Override
-    public void setEntity(EntityLocal entity) {
-        super.setEntity(entity);
-        
-        if (getConfig(USE_SERVICE_STATE_RUNNING)) {
-            subscribeToMembers((Group)entity, Attributes.SERVICE_STATE_ACTUAL, new SensorEventListener<Lifecycle>() {
-                @Override public void onEvent(SensorEvent<Lifecycle> event) {
-                    if (!acceptsMember(event.getSource())) return;
-                    onMemberStatus(event.getSource(), event.getValue());
-                }
-            });
-        }
-        
-        subscribeToMembers((Group)entity, Startable.SERVICE_UP, new SensorEventListener<Boolean>() {
-            @Override public void onEvent(SensorEvent<Boolean> event) {
-                if (!acceptsMember(event.getSource())) return;
-                onMemberIsUp(event.getSource(), event.getValue());
-            }
-        });
-        
-        subscribe(entity, Changeable.MEMBER_REMOVED, new SensorEventListener<Entity>() {
-            @Override public void onEvent(SensorEvent<Entity> event) {
-                onMemberRemoved(event.getValue());
-            }
-        });
-        
-        subscribe(entity, Changeable.MEMBER_ADDED, new SensorEventListener<Entity>() {
-            @Override public void onEvent(SensorEvent<Entity> event) {
-                if (!acceptsMember(event.getSource())) return;
-                onMemberAdded(event.getValue());
-            }
-        });
-        
-        for (Entity member : ((Group)entity).getMembers()) {
-            if (!acceptsMember(member)) continue;
-            onMemberAdded(member);
-        }
-    }
-    
-    private synchronized void onMemberIsUp(Entity member, Boolean isUp) {
-        if (isUp != null) {
-            Boolean old = memberIsUps.put(member, isUp);
-            if (isUp) {
-                memberLastUps.put(member, System.currentTimeMillis());
-            }
-            if (!Objects.equal(old, isUp)) {
-                checkMemberHealth(member);
-            }
-        }
-    }
-    
-    private synchronized void onMemberStatus(Entity member, Lifecycle status) {
-        if (status != null) {
-            Lifecycle old = memberStates.put(member, status);
-            if (!Objects.equal(old, status)) {
-                checkMemberHealth(member);
-            }
-        }
-    }
-    
-    private synchronized void onMemberAdded(Entity member) {
-        if (getConfig(USE_SERVICE_STATE_RUNNING)) {
-            Lifecycle status = member.getAttribute(Attributes.SERVICE_STATE_ACTUAL);
-            onMemberStatus(member, status);
-        }
-        
-        Boolean isUp = member.getAttribute(Startable.SERVICE_UP);
-        onMemberIsUp(member, isUp);
-    }
-    
-    private synchronized void onMemberRemoved(Entity member) {
-        memberStates.remove(member);
-        memberIsUps.remove(member);
-        memberLastUps.remove(member);
-        memberFailures.remove(member);
-    }
-    
-    private synchronized void checkMemberHealth(Entity member) {
-        Long lastUpTime = memberLastUps.get(member);
-        Boolean isUp = memberIsUps.get(member);
-        Lifecycle status = memberStates.get(member);
-        boolean failed = 
-                (getConfig(USE_SERVICE_STATE_RUNNING) && status == Lifecycle.ON_FIRE) ||
-                (Boolean.FALSE.equals(isUp) &&
-                        (getConfig(USE_SERVICE_STATE_RUNNING) ? status == Lifecycle.RUNNING : true) && 
-                        (getConfig(ONLY_REPORT_IF_PREVIOUSLY_UP) ? lastUpTime != null : true));
-        boolean recovered = 
-                (getConfig(USE_SERVICE_STATE_RUNNING) ? status == Lifecycle.RUNNING : true) && 
-                Boolean.TRUE.equals(isUp);
-
-        String description = String.format("location=%s; isUp=%s; status=%s; lastReportedUp=%s; timeNow=%s", 
-                member.getLocations(), 
-                (isUp != null ? isUp : "<unreported>"),
-                (status != null ? status : "<unreported>"),
-                (lastUpTime != null ? Time.makeDateString(lastUpTime) : "<never>"),
-                Time.makeDateString(System.currentTimeMillis()));
-
-        if (memberFailures.containsKey(member)) {
-            if (recovered) {
-                LOG.info("{} health-check for {}, component recovered (from failure at {}): {}", 
-                        new Object[] {this, member, Time.makeDateString(memberFailures.get(member)), description});
-                entity.emit(HASensors.ENTITY_RECOVERED, new HASensors.FailureDescriptor(member, description));
-                memberFailures.remove(member);
-            } else if (failed) {
-                if (LOG.isTraceEnabled()) LOG.trace("{} health-check for {}, confirmed still failed: {}", new Object[] {this, member, description});
-            } else {
-                if (LOG.isTraceEnabled()) LOG.trace("{} health-check for {}, in unconfirmed sate (previously failed): {}", new Object[] {this, member, description});
-            }
-        } else if (failed) {
-            LOG.info("{} health-check for {}, component failed: {}", new Object[] {this, member, description});
-            memberFailures.put(member, System.currentTimeMillis());
-            entity.emit(HASensors.ENTITY_FAILED, new HASensors.FailureDescriptor(member, description));
-        } else {
-            if (LOG.isTraceEnabled()) LOG.trace("{} health-check for {}, either healthy or insufficient data: {}", new Object[] {this, member, description});
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d9715b42/policy/src/test/java/brooklyn/policy/ha/MemberFailureDetectionPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/ha/MemberFailureDetectionPolicyTest.java b/policy/src/test/java/brooklyn/policy/ha/MemberFailureDetectionPolicyTest.java
deleted file mode 100644
index 0587804..0000000
--- a/policy/src/test/java/brooklyn/policy/ha/MemberFailureDetectionPolicyTest.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.policy.ha;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.BasicGroup;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.event.Sensor;
-import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.policy.ha.HASensors.FailureDescriptor;
-import brooklyn.test.TestUtils;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.test.entity.TestEntity;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-
-public class MemberFailureDetectionPolicyTest {
-
-    private static final int TIMEOUT_MS = 10*1000;
-
-    private MemberFailureDetectionPolicy policy;
-    private TestApplication app;
-    private BasicGroup group;
-    private List<SensorEvent<FailureDescriptor>> events;
-
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        group = app.createAndManageChild(EntitySpec.create(BasicGroup.class)
-                .configure("childrenAsMembers", true));
-        
-        app.getManagementContext().getSubscriptionManager().subscribe(
-                null, 
-                HASensors.ENTITY_FAILED, 
-                new SensorEventListener<FailureDescriptor>() {
-                    @Override public void onEvent(SensorEvent<FailureDescriptor> event) {
-                        events.add(event);
-                    }
-                });
-        app.getManagementContext().getSubscriptionManager().subscribe(
-                null, 
-                HASensors.ENTITY_RECOVERED, 
-                new SensorEventListener<FailureDescriptor>() {
-                    @Override public void onEvent(SensorEvent<FailureDescriptor> event) {
-                        events.add(event);
-                    }
-                });
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    private TestEntity createAndManageChildOf(Entity parent) {
-        TestEntity e = app.getManagementContext().getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
-        e.setParent(parent);
-        Entities.manage(e);
-        return e;
-    }
-    
-    @Test(groups="Integration") // Has a 1 second wait
-    public void testNotNotifiedOfFailuresForHealthyMembers() throws Exception {
-        // Create members before and after the policy is registered, to test both scenarios
-        TestEntity e1 = createAndManageChildOf(group);
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e2 = createAndManageChildOf(group);
-        e2.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e2.setAttribute(TestEntity.SERVICE_UP, true);
-
-        TestUtils.assertSucceedsContinually(new Runnable() {
-            public void run() {
-                assertTrue(events.isEmpty(), "events="+events);
-            }});
-    }
-    
-    @Test
-    public void testNotifiedOfFailedMember() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-        assertEquals(events.size(), 1, "events="+events);
-    }
-    
-    @Test
-    public void testNotifiedOfFailedMemberOnStateOnFire() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.ON_FIRE);
-
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-        assertEquals(events.size(), 1, "events="+events);
-    }
-    
-    @Test
-    public void testNotifiedOfRecoveredMember() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        // Make the entity fail
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-
-        // And make the entity recover
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        assertHasEventEventually(HASensors.ENTITY_RECOVERED, Predicates.<Object>equalTo(e1), null);
-        assertEquals(events.size(), 2, "events="+events);
-    }
-    
-    @Test(groups="Integration") // Has a 1 second wait
-    public void testOnlyReportsFailureIfPreviouslyUp() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        // Make the entity fail
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        TestUtils.assertSucceedsContinually(new Runnable() {
-            public void run() {
-                assertTrue(events.isEmpty(), "events="+events);
-            }});
-    }
-    
-    @Test(groups="Integration") // Has a 1 second wait
-    public void testOnlyReportsFailureIfRunning() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.<String,Object>of());
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        // Make the entity fail
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.STARTING);
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        TestUtils.assertSucceedsContinually(new Runnable() {
-            public void run() {
-                assertTrue(events.isEmpty(), "events="+events);
-            }});
-    }
-    
-    @Test
-    public void testReportsFailureWhenNotPreviouslyUp() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.of("onlyReportIfPreviouslyUp", false));
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        // Make the entity fail
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-    }
-    
-    @Test
-    public void testReportsFailureWhenNoServiceState() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.of("useServiceStateRunning", false));
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        
-        // Make the entity fail
-        e1.setAttribute(TestEntity.SERVICE_UP, true);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-    }
-    
-    @Test
-    public void testReportsFailureWhenAlreadyDownOnBecomingMember() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.of("onlyReportIfPreviouslyUp", false));
-        group.addPolicy(policy);
-        
-        TestEntity e1 = createAndManageChildOf(group);
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.RUNNING);
-        e1.setAttribute(TestEntity.SERVICE_UP, false);
-
-        group.addMember(e1);
-        
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-    }
-    
-    @Test
-    public void testReportsFailureWhenAlreadyOnFireOnBecomingMember() throws Exception {
-        policy = new MemberFailureDetectionPolicy(MutableMap.of("onlyReportIfPreviouslyUp", false));
-        group.addPolicy(policy);
-        
-        TestEntity e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        e1.setAttribute(TestEntity.SERVICE_STATE, Lifecycle.ON_FIRE);
-
-        group.addMember(e1);
-        
-        assertHasEventEventually(HASensors.ENTITY_FAILED, Predicates.<Object>equalTo(e1), null);
-    }
-    
-    private void assertHasEvent(Sensor<?> sensor, Predicate<Object> componentPredicate, Predicate<? super CharSequence> descriptionPredicate) {
-        for (SensorEvent<FailureDescriptor> event : events) {
-            if (event.getSensor().equals(sensor) && 
-                    (componentPredicate == null || componentPredicate.apply(event.getValue().getComponent())) &&
-                    (descriptionPredicate == null || descriptionPredicate.apply(event.getValue().getDescription()))) {
-                return;
-            }
-        }
-        fail("No matching "+sensor+" event found; events="+events);
-    }
-    
-    private void assertHasEventEventually(final Sensor<?> sensor, final Predicate<Object> componentPredicate, final Predicate<? super CharSequence> descriptionPredicate) {
-        TestUtils.executeUntilSucceeds(MutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
-            @Override public void run() {
-                assertHasEvent(sensor, componentPredicate, descriptionPredicate);
-            }});
-    }
-}