[ 
https://issues.apache.org/jira/browse/GEODE-482?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kirk Lund updated GEODE-482:
----------------------------
    Comment: was deleted

(was: A Pivotal Tracker story has been created for this Issue: 
https://www.pivotaltracker.com/story/show/106767128)

> deserialization can hang for one minute waiting for a DataSerializer
> --------------------------------------------------------------------
>
>                 Key: GEODE-482
>                 URL: https://issues.apache.org/jira/browse/GEODE-482
>             Project: Geode
>          Issue Type: Bug
>          Components: serialization
>            Reporter: Darrel Schneider
>
> If a JVM does not explicitly register a DataSerializer it is going to use but 
> instead relies and Geode to distribute the DataSerializer to it from another 
> member or server then a race condition exists that can cause it to wait for 1 
> minute and fail to find the DataSerializer.
> The work around for this is to explicitly register the DataSerializer using a 
> static initializer or the cache.xml serializer element.
> A unit test was intermittently hitting this problem (see GEODE-376) but that 
> test has been changed to workaround the race in the product.
> The race is in this code 
> com.gemstone.gemfire.internal.InternalDataSerializer.getSerializer(int):
>     SerializerAttributesHolder sah=idsToHolders.get(idx);
>     while (result == null && !timedOut && sah == null) {
>       Object o = idsToSerializers.putIfAbsent(idx, marker);
>       if (o == null) {
>         result = marker.getSerializer();
> If getSerializer sees a null "sah" but before it can do the 
> "idsToSerializers.putIfAbsent" another thread executes this code 
> com.gemstone.gemfire.internal.InternalDataSerializer.register(String, 
> boolean, SerializerAttributesHolder):
>     if (className == null || className.trim().equals("")) {
>       throw new IllegalArgumentException("Class name cannot be null or 
> empty.");
>     }
>     SerializerAttributesHolder oldValue = dsClassesToHolders.putIfAbsent(
>         className, holder);
>     if (oldValue != null) {
>       if (oldValue.getId() != 0 && holder.getId() != 0
>           && oldValue.getId() != holder.getId()) {
>         throw new IllegalStateException(snip);
>      }
>     }
>     idsToHolders.putIfAbsent(holder.getId(), holder);
>     Object ds = idsToSerializers.get(holder.getId());
>     if (ds instanceof Marker) {
>       synchronized (ds) {
>         ((Marker)ds).notifyAll();
>       }
>     }
> So this thread does not see the Marker and does not notify it.
> That leaves the first thread stuck on Marker.getSerializer which blocks for 1 
> minute and then returns null.
> A new test needs to be written that will reliably fail for this bug.
> A multi-threaded unit test that uses these two methods would be best.



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

Reply via email to