You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@brooklyn.apache.org by "Aled Sage (JIRA)" <ji...@apache.org> on 2017/11/14 12:07:00 UTC
[jira] [Created] (BROOKLYN-564)
ElectPrimaryTest.testSelectionModeFailoverReelectWithPreference fails
non-deterministically
Aled Sage created BROOKLYN-564:
----------------------------------
Summary: ElectPrimaryTest.testSelectionModeFailoverReelectWithPreference fails non-deterministically
Key: BROOKLYN-564
URL: https://issues.apache.org/jira/browse/BROOKLYN-564
Project: Brooklyn
Issue Type: Bug
Reporter: Aled Sage
Priority: Minor
In Brooklyn 1.0.0-SNAPSHOT, {{ElectPrimaryTest.testSelectionModeFailoverReelectWithPreference fails non-deterministically}} sometimes fails in jenkins:
{noformat}
2017-11-13 11:45:06,214 INFO TESTNG INVOKING CONFIGURATION: "Surefire test" - @BeforeMethod org.apache.brooklyn.camp.brooklyn.AbstractYamlRebindTest.setUp()
2017-11-13 11:45:06,214 INFO Added external config supplier named 'brooklyn-demo-sample': org.apache.brooklyn.core.config.external.InPlaceExternalConfigSupplier@380e4e8a
2017-11-13 11:45:06,219 INFO Rebind check: no existing state; will persist new items to /tmp/ElectPrimaryTest-UgLc
2017-11-13 11:45:06,220 INFO No Camp-YAML parser registered for parsing catalog item DSL; skipping DSL-parsing
2017-11-13 11:45:06,226 INFO Test class org.apache.brooklyn.camp.brooklyn.test.policy.failover.ElectPrimaryTest persisting to /tmp/ElectPrimaryTest-UgLc
2017-11-13 11:45:06,227 INFO TESTNG PASSED CONFIGURATION: "Surefire test" - @BeforeMethod org.apache.brooklyn.camp.brooklyn.AbstractYamlRebindTest.setUp() finished in 13 ms
2017-11-13 11:45:06,227 INFO TESTNG INVOKING: "Surefire test" - org.apache.brooklyn.camp.brooklyn.test.policy.failover.ElectPrimaryTest.testSelectionModeFailoverReelectWithPreference()
2017-11-13 11:45:06,279 INFO Test created app, and will now start BasicApplicationImpl{id=nq3a3nshq1}
2017-11-13 11:45:06,307 INFO Detected new primary TestEntityImpl{id=rg0witaqno} at BasicApplicationImpl{id=nq3a3nshq1} (previously had null)
2017-11-13 11:45:06,315 INFO Primary TestEntityImpl{id=rg0witaqno} at BasicApplicationImpl{id=nq3a3nshq1} detected as healthy
2017-11-13 11:45:06,329 INFO Started application BasicApplicationImpl{id=nq3a3nshq1}
2017-11-13 11:45:06,330 INFO Detected new primary TestEntityImpl{id=cijb9r79z1} at BasicApplicationImpl{id=nq3a3nshq1} (previously had TestEntityImpl{id=rg0witaqno})
2017-11-13 11:45:06,331 INFO Detected new primary TestEntityImpl{id=rg0witaqno} at BasicApplicationImpl{id=nq3a3nshq1} (previously had TestEntityImpl{id=cijb9r79z1})
2017-11-13 11:45:36,343 INFO succeedsEventually exceeded max attempts or timeout - 75 attempts lasting 30000 ms, for RunnableAdapter(org.apache.brooklyn.core.entity.EntityAsserts$2@2eae3041)
2017-11-13 11:45:36,344 INFO failed succeeds-eventually, 75 attempts, 30000ms elapsed (rethrowing): java.lang.AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
2017-11-13 11:45:36,346 ERROR Failed: java.lang.AssertionError: failed succeeds-eventually, 75 attempts, 30001ms elapsed: AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
java.lang.AssertionError: failed succeeds-eventually, 75 attempts, 30001ms elapsed: AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:1009) ~[brooklyn-utils-common-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
Caused by: java.lang.AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
at org.apache.brooklyn.test.Asserts.fail(Asserts.java:755) ~[brooklyn-utils-common-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
BasicApplicationImpl{id=nq3a3nshq1} nq3a3nshq1
displayName = Application (nq3a3nshq1)
locations = []
brooklyn.wrapper_app = true
camp.template.id = WpI0y0hC
quorum.running = QuorumCheck[require=1,0.0%]
quorum.up = QuorumCheck[require=1,0.0%]
application.id: nq3a3nshq1
entity.id: nq3a3nshq1
primary: TestEntityImpl{id=rg0witaqno}
service.isUp: true
service.state: running
service.state.expected: running @ 1510573506343 / Mon Nov 13 11:45:06 UTC 2017
Policies:
ElectPrimaryPolicy{id=gcebjkm4dq, name=null, running=true}
primary.selection.mode[ConfigKey:org.apache.brooklyn.policy.failover.ElectPrimaryConfig$SelectionMode] = FAILOVER
primary.stopped.wait.timeout[ConfigKey:org.apache.brooklyn.util.time.Duration] = 0ms
Enrichers:
Transformer{uniqueTag=service.isUp if no service.notUp.indicators, running=true, entity=BasicApplicationImpl{id=nq3a3nshq1}, id=iq1mvcb263}
enricher.sourceSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.notUp.indicators (java.util.Map)
enricher.suppressDuplicates[ConfigKey:java.lang.Boolean] = true
enricher.targetSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.isUp (java.lang.Boolean)
enricher.transformation[ConfigKey:com.google.common.base.Function] = if[{Predicates.not(Predicates.isNull())=forPredicate(Predicates.equalTo(0)(sizeFunction(keys)))}]-else[UNCHANGED]
ComputeServiceState{uniqueTag=service.state.actual, running=true, entity=BasicApplicationImpl{id=nq3a3nshq1}, id=d90sql52vz}
ComputeServiceIndicatorsFromChildrenAndMembers{uniqueTag=service-lifecycle-indicators-from-children-and-members, running=true, entity=BasicApplicationImpl{id=nq3a3nshq1}, id=g6pgaxo97d}
enricher.aggregating.fromChildren[ConfigKey:java.lang.Boolean] = true
enricher.aggregating.fromMembers[ConfigKey:java.lang.Boolean] = true
enricher.service_state.children_and_members.quorum.running[ConfigKey:org.apache.brooklyn.util.collections.QuorumCheck] = QuorumCheck[all;require=0,100.0%]
enricher.service_state.children_and_members.quorum.up[ConfigKey:org.apache.brooklyn.util.collections.QuorumCheck] = QuorumCheck[all;require=0,100.0%]
PrimaryRunningEnricher{running=true, entity=BasicApplicationImpl{id=nq3a3nshq1}, id=wcpg5ordwa}
TestEntityImpl{id=rg0witaqno} rg0witaqno
displayName = a
catalogItemId = item-from-test:0.0.0-SNAPSHOT
locations = []
camp.template.id = pfqqeadI
ha.primary.weight = 1
application.id: nq3a3nshq1
catalog.id: item-from-test:0.0.0-SNAPSHOT
entity.id: rg0witaqno
service.isUp: true
service.state: running
service.state.expected: running @ 1510573506297 / Mon Nov 13 11:45:06 UTC 2017
test.attributeAndConfString: defaultval
Enrichers:
Transformer{uniqueTag=service.isUp if no service.notUp.indicators, running=true, entity=TestEntityImpl{id=rg0witaqno}, id=bjbxe2ddrz}
enricher.sourceSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.notUp.indicators (java.util.Map)
enricher.suppressDuplicates[ConfigKey:java.lang.Boolean] = true
enricher.targetSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.isUp (java.lang.Boolean)
enricher.transformation[ConfigKey:com.google.common.base.Function] = if[{Predicates.not(Predicates.isNull())=forPredicate(Predicates.equalTo(0)(sizeFunction(keys)))}]-else[UNCHANGED]
ComputeServiceState{uniqueTag=service.state.actual, running=true, entity=TestEntityImpl{id=rg0witaqno}, id=qdmiyq1sp8}
TestEntityImpl{id=cijb9r79z1} cijb9r79z1
displayName = b
catalogItemId = item-from-test:0.0.0-SNAPSHOT
locations = []
camp.template.id = sjvkU3bT
application.id: nq3a3nshq1
catalog.id: item-from-test:0.0.0-SNAPSHOT
entity.id: cijb9r79z1
ha.primary.weight: 2.0
service.isUp: true
service.state: running
service.state.expected: running @ 1510573506302 / Mon Nov 13 11:45:06 UTC 2017
test.attributeAndConfString: defaultval
Enrichers:
Transformer{uniqueTag=service.isUp if no service.notUp.indicators, running=true, entity=TestEntityImpl{id=cijb9r79z1}, id=h1z8b6pteu}
enricher.sourceSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.notUp.indicators (java.util.Map)
enricher.suppressDuplicates[ConfigKey:java.lang.Boolean] = true
enricher.targetSensor[ConfigKey:org.apache.brooklyn.api.sensor.Sensor] = Sensor: service.isUp (java.lang.Boolean)
enricher.transformation[ConfigKey:com.google.common.base.Function] = if[{Predicates.not(Predicates.isNull())=forPredicate(Predicates.equalTo(0)(sizeFunction(keys)))}]-else[UNCHANGED]
ComputeServiceState{uniqueTag=service.state.actual, running=true, entity=TestEntityImpl{id=cijb9r79z1}, id=n27syuicif}
Standard Error
java.lang.AssertionError: failed succeeds-eventually, 75 attempts, 30001ms elapsed: AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:1009)
at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:892)
at org.apache.brooklyn.core.entity.EntityAsserts.assertAttributeEventually(EntityAsserts.java:93)
at org.apache.brooklyn.core.entity.EntityAsserts.assertAttributeEventually(EntityAsserts.java:88)
at org.apache.brooklyn.camp.brooklyn.test.policy.failover.ElectPrimaryTest.runSelectionModeTest(ElectPrimaryTest.java:334)
at org.apache.brooklyn.camp.brooklyn.test.policy.failover.ElectPrimaryTest.testSelectionModeFailoverReelectWithPreference(ElectPrimaryTest.java:292)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:756)
at org.testng.TestRunner.run(TestRunner.java:610)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
at org.testng.TestNG.runSuites(TestNG.java:1133)
at org.testng.TestNG.run(TestNG.java:1104)
at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:132)
at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:193)
at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:94)
at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:147)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
Caused by: java.lang.AssertionError: attribute=Sensor: primary (org.apache.brooklyn.api.entity.Entity); val=TestEntityImpl{id=rg0witaqno}
at org.apache.brooklyn.test.Asserts.fail(Asserts.java:755)
at org.apache.brooklyn.test.Asserts.assertTrue(Asserts.java:734)
at org.apache.brooklyn.core.entity.EntityAsserts.assertAttribute(EntityAsserts.java:103)
at org.apache.brooklyn.core.entity.EntityAsserts$2.run(EntityAsserts.java:95)
at org.apache.brooklyn.test.Asserts$RunnableAdapter.call(Asserts.java:1363)
at org.apache.brooklyn.test.Asserts.succeedsEventually(Asserts.java:970)
... 34 more
{noformat}
The underlying reason is that the {{ElectPrimaryEffector}} is executed multiple times concurrently (it could be up to three: first from {{ElectPrimaryPolicy.setEntity}} calling {{rescanRequest}}, next from a change of a child's sensor, and third in the {{ElectPrimaryTest.runSelectionModeTest}} when it explicitly calls the effector with mode=best; in this case I think it's just the last two; the first doesn't happen concurrently because the policy is added before the entity is managed).
When the effectors execute concurrently, the mode=best invocation can set the primary first, and then the one triggered by sensor-changed (which had already decided who the primary should be) sees that the current-active does not match what it thinks.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)