[ 
https://issues.apache.org/jira/browse/BROOKLYN-345?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15705341#comment-15705341
 ] 

ASF GitHub Bot commented on BROOKLYN-345:
-----------------------------------------

Github user ahgittin commented on a diff in the pull request:

    https://github.com/apache/brooklyn-server/pull/440#discussion_r90010996
  
    --- Diff: 
core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
 ---
    @@ -163,13 +163,18 @@ public ConfigBag getLocalConfigBag() {
             return putAllOwnConfigIntoSafely(ConfigBag.newInstance()).seal();
         }
     
    -    public Object setConfig(ConfigKey<?> key, Object v) {
    -        Object val = coerceConfigVal(key, v);
    +    public Object setConfig(final ConfigKey<?> key, Object v) {
    +        // Use our own key for writing, (e.g. in-case it should (or should 
not) be a structured key like MapConfigKey).
    +        // This is same logic as for getConfig, except we only have to 
look at our own container.
    +        ConfigKey<?> ownKey = getKeyAtContainer(getContainer(), key);
    +        if (ownKey==null) ownKey = key;
    +
    +        Object val = coerceConfigVal(ownKey, v);
    --- End diff --
    
    is there any harm in coercing best-effort on config puts additionally?


> NPE on rebind of enricher ServiceStateLogic$ComputeServiceState
> ---------------------------------------------------------------
>
>                 Key: BROOKLYN-345
>                 URL: https://issues.apache.org/jira/browse/BROOKLYN-345
>             Project: Brooklyn
>          Issue Type: Bug
>            Reporter: Aled Sage
>
> Using Brooklyn 0.10.0-SNAPSHOT (e.g. brooklyn-server commit 66b9b1c)...
> When rebinding to existing persisted state, it failed to create the enricher 
> {{ServiceStateLogic$ComputeServiceState}} with the NPE shown below (but then 
> continued, so this is otherwise benign):
> {noformat}
> 2016-09-09 09:31:03,850 WARN  o.a.b.c.m.r.RebindExceptionHandlerImpl 
> [brooklyn-execmanager-VtZheMDn-0]: problem adding enricher cdoy70m1hv 
> (ServiceFailureDetector{name=org.apache.brooklyn.policy.ha.ServiceFailureDetector,
>  uniqueTag=service.state.actual, running=true, 
> entity=VanillaSoftwareProcessImpl{id=pwz8z4pbyp}, id=cdoy70m1hv}) to entity 
> pwz8z4pbyp (VanillaSoftwareProcessImpl{id=pwz8z4pbyp}); continuing
> java.lang.NullPointerException: null
>         at 
> org.apache.brooklyn.policy.ha.ServiceFailureDetector.setActualState(ServiceFailureDetector.java:188)
>  ~[brooklyn-policy-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic$ComputeServiceState.onEvent(ServiceStateLogic.java:288)
>  ~[brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.policy.ha.ServiceFailureDetector.onEvent(ServiceFailureDetector.java:159)
>  ~[brooklyn-policy-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic$ComputeServiceState.setEntity(ServiceStateLogic.java:274)
>  ~[brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity$BasicEnricherSupport.add(AbstractEntity.java:1788)
>  ~[brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.BasicEntityRebindSupport.addEnrichers(BasicEntityRebindSupport.java:145)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.BasicEntityRebindSupport.addEnrichers(BasicEntityRebindSupport.java:47)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindIteration.associateAdjunctsWithEntities(RebindIteration.java:650)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindIteration.doRun(RebindIteration.java:244)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.InitialFullRebindIteration.doRun(InitialFullRebindIteration.java:69)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindIteration.run(RebindIteration.java:266)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.rebindImpl(RebindManagerImpl.java:558)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:508)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:506)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at 
> org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:519)
>  [brooklyn-core-0.10.0-20160907.0931.jar:0.10.0-20160907.0931]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
> [na:1.7.0_95]
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>  [na:1.7.0_95]
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>  [na:1.7.0_95]
>         at java.lang.Thread.run(Thread.java:745) [na:1.7.0_95]
> {noformat}
> The line throwing the NPE is executing {{setEntityOnFireTime = now + 
> getConfig(SERVICE_ON_FIRE_STABILIZATION_DELAY).toMilliseconds()}}. That 
> suggests we got null for the config value, even though there is a default 
> value of zero for it.
> The enricher persisted state contains:
> {noformat}
>     <serviceOnFire.stabilizationDelay>
>       
> <org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent_-DslConfigSupplier>
>         <component>
>           <componentId></componentId>
>           <scope>THIS</scope>
>         </component>
>         <keyName>swarm.recovery.stabilizationDelay</keyName>
>       
> </org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent_-DslConfigSupplier>
>     </serviceOnFire.stabilizationDelay>
> {noformat}
> And the owning entity has:
> {noformat}
>   brooklyn.parameters:
>     - name: swarm.recovery.stabilizationDelay
>       label: Stabilization Delay
>       description: |
>         Time period for which the service must be consistently in the same 
> state to trigger an action
>       # A restart shouldn&apos;t trigger failure
>       type: org.apache.brooklyn.util.time.Duration
>       default: 5m
> {noformat}
> There are a few things we should think about fixing:
> 1. guard against the NPE in {{ServiceFailureDetector.setActualState}} (i.e. 
> handle when the config returns null) - but unclear what value it should then 
> default to.
> 2. avoid calling this code on rebind. for example, instead of 
> {{ComputeServiceState.setEntity}} immediately calling {{onEvent(null)}}, it 
> could subscribe with "notifyOfInitialValue" so that it gets a callback (in 
> the right thread, at the right time).
> 3. investigate further why the config lookup returned null - e.g. is it 
> because entity wasn't fully initialised, or because the DSL didn't find the 
> default value defined in brooklyn.parameters?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to