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

ASF GitHub Bot commented on CURATOR-452:
----------------------------------------

Github user cmckn commented on the issue:

    https://github.com/apache/curator/pull/261
  
    I realize this issue has been closed, but I'm still seeing unexpected 
exceptions in some of my applications during `ServiceCacheImpl#start`.
    The merged changes to address this added a null-check around calls to 
`ServiceCacheImpl#addInstance` within `ServiceCacheImpl#start` (correct me if 
this is wrong).
    From what I've seen in my own apps, the issue is not caused by a `null` 
`char[]` being passed to `ServiceCacheImpl#addInstance` -- it is caused by an 
*empty* `char[]` being passed. This empty array causes a `NullPointerException` 
to be thrown by my deserializer, or (if the empty case is handled there, 
returning `null` from the deserializer) causes a `NullPointerException` when 
the `null` instance is put in `instances` (a `ConcurrentMap`).
    The implementation of `ServiceCacheImpl#addInstance` below is what resolved 
things for me, patched into the `4.0.1` release. The `if` at the open of the 
function is the only change. Just wanted to throw this out there, because I've 
only been able to resolve the issue by using this patch -- no dice on the 
current `master` branch. This patch doesn't appear to cause any issues, but I'm 
not sure if the `cache.clearDataBytes...` call should be performed regardless 
of whether or not the `byte[]` is empty (i.e. I'm not sure if bailing out of 
the function at this particular step is appropriate or will have side-effects).
    
    ```
    private void addInstance(ChildData childData, boolean onlyIfAbsent) throws 
Exception
        {
    +           if( childData.getData() == null || childData.getData().length 
== 0 )
    +           {
    +                   return;
    +           }
            String                  instanceId = instanceIdFromData(childData);
            ServiceInstance<T>      serviceInstance = 
discovery.getSerializer().deserialize(childData.getData());
            if ( onlyIfAbsent )
            {
                instances.putIfAbsent(instanceId, serviceInstance);
            }
            else
            {
                instances.put(instanceId, serviceInstance);
            }
            cache.clearDataBytes(childData.getPath(), 
childData.getStat().getVersion());
        }
    ```
    Happy to provide more information if needed.


> ChildData.getData() can be null
> -------------------------------
>
>                 Key: CURATOR-452
>                 URL: https://issues.apache.org/jira/browse/CURATOR-452
>             Project: Apache Curator
>          Issue Type: Bug
>          Components: Client
>    Affects Versions: 2.11.1
>            Reporter: Egor Ryashin
>            Assignee: Jordan Zimmerman
>            Priority: Critical
>             Fix For: 4.1.0
>
>
> Curator client tries to make ObjectMapper to parse null (ChildData.getData() 
> can be null).
> {code:java}
> java.lang.NullPointerException
>  at org.codehaus.jackson.JsonFactory.createJsonParser(JsonFactory.java:604)
>  at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1973)
>  at 
> org.apache.curator.x.discovery.details.JsonInstanceSerializer.deserialize(JsonInstanceSerializer.java:50)
>  at 
> org.apache.curator.x.discovery.details.ServiceCacheImpl.addInstance(ServiceCacheImpl.java:193)
>  at 
> org.apache.curator.x.discovery.details.ServiceCacheImpl.start(ServiceCacheImpl.java:96)
>  at 
> org.apache.curator.x.discovery.details.ServiceProviderImpl.start(ServiceProviderImpl.java:67){code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to