Aled Sage created BROOKLYN-474:
----------------------------------
Summary: Rebind failed for historic
ZooKeeperEnsembleImpl$MemberTrackingPolicy (no-arg constructor not accessible)
Key: BROOKLYN-474
URL: https://issues.apache.org/jira/browse/BROOKLYN-474
Project: Brooklyn
Issue Type: Bug
Reporter: Aled Sage
When testing rebind with 0.11.0 RC1 against historic persisted state, we saw
the exception below:
{noformat}
Caused by: org.apache.brooklyn.util.exceptions.CompoundRuntimeException:
Failure rebinding; 2 errors including: problem creating POLICY lplpmv3goo of
type
org.apache.brooklyn.entity.zookeeper.ZooKeeperEnsembleImpl$MemberTrackingPolicy:
Cannot instantiate instance of type class
org.apache.brooklyn.entity.zookeeper.ZooKeeperEnsembleImpl$MemberTrackingPolicy;
expected constructor signature not found (args are [{id=lplpmv3goo,
deferConstructionChecks=true, noConstructionInit=true,
group=ZooKeeperEnsembleImpl{id=stkwkmp76w},
uniqueTag=MemberTrackingPolicy:ZooKeeperEnsembleImpl{id=stkwkmp76w}, tags=[]}])
at
org.apache.brooklyn.util.exceptions.Exceptions.create(Exceptions.java:474)[141:org.apache.brooklyn.utils-common:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onDoneImpl(RebindExceptionHandlerImpl.java:498)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onDone(RebindExceptionHandlerImpl.java:414)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration.run(RebindIteration.java:267)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.rebindImpl(RebindManagerImpl.java:560)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:510)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:508)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:529)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
... 4 more
Caused by: java.lang.IllegalStateException: problem creating POLICY lplpmv3goo
of type
org.apache.brooklyn.entity.zookeeper.ZooKeeperEnsembleImpl$MemberTrackingPolicy
at
org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onCreateFailed(RebindExceptionHandlerImpl.java:265)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration.instantiateAdjuncts(RebindIteration.java:484)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration.doRun(RebindIteration.java:241)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.InitialFullRebindIteration.doRun(InitialFullRebindIteration.java:69)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration.run(RebindIteration.java:265)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
... 8 more
Caused by: java.lang.IllegalStateException: Cannot instantiate instance of type
class
org.apache.brooklyn.entity.zookeeper.ZooKeeperEnsembleImpl$MemberTrackingPolicy;
expected constructor signature not found (args are [{id=lplpmv3goo,
deferConstructionChecks=true, noConstructionInit=true,
group=ZooKeeperEnsembleImpl{id=stkwkmp76w},
uniqueTag=MemberTrackingPolicy:ZooKeeperEnsembleImpl{id=stkwkmp76w}, tags=[]}])
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.invokeConstructor(RebindIteration.java:1157)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.newPolicy(RebindIteration.java:1061)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
at
org.apache.brooklyn.core.mgmt.rebind.RebindIteration.instantiateAdjuncts(RebindIteration.java:481)[120:org.apache.brooklyn.core:0.11.0.SNAPSHOT]
... 11 more
{noformat}
The problem is that persisted state refers to an instance of
{{org.apache.brooklyn.entity.zookeeper.ZooKeeperEnsembleImpl$MemberTrackingPolicy}},
which has since been made a private class. The no-arg constructor is therefore
not directly accessible, which leads us down the wrong code path.
The generalise advice would be to ensure that the class for anything in
persisted state has a public no-arg constructor.
A general fix would be to use {{getDeclaredConsturctor(new Class[0])}} (so we
get the private constructor), and then to call the constructor after doing
{{constructor.setAccessible(true)}}.
We should also add a public no-arg constructors to
{{ZooKeeperEnsembleImpl$MemberTrackingPolicy}} (which only exists for backwards
compatibility).
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)