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

Mark Hanson closed GEODE-7219.
------------------------------

Transition from Resolved to Closed for Apache Geode 1.11.0 RC4 release.

> BufferUnderflowException in PutReplyMessage deserialization
> -----------------------------------------------------------
>
>                 Key: GEODE-7219
>                 URL: https://issues.apache.org/jira/browse/GEODE-7219
>             Project: Geode
>          Issue Type: Bug
>          Components: regions
>            Reporter: Bruce J Schuchardt
>            Assignee: Bruce J Schuchardt
>            Priority: Major
>             Fix For: 1.11.0
>
>          Time Spent: 2h 40m
>  Remaining Estimate: 0h
>
> I ran into this exception in three different regression tests and see history 
> of it happening in other people's tests.  I think it's due to 
> VersionTag.toData() making serialization decisions at the same time some 
> other thread is modifying the version tag.
> {noformat}
> [fatal 2019/09/18 00:47:52.835 PDT <P2P message reader for 
> rs-Awesome-549-1146a0i3large-hydra-client-10(bridgegemfire1_host1_12399:12399)<ec><v1>:41001
>  unshared ordered uid=452 dom #2 port=46062> tid=0xdd] Error deserializing 
> message
> java.nio.BufferUnderflowException
>       at java.nio.Buffer.nextGetIndex(Buffer.java:500)
>       at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:249)
>       at 
> org.apache.geode.internal.tcp.ByteBufferInputStream$ByteBufferByteSource.get(ByteBufferInputStream.java:206)
>       at 
> org.apache.geode.internal.tcp.ByteBufferInputStream.readByte(ByteBufferInputStream.java:892)
>       at 
> org.apache.geode.internal.serialization.StaticSerialization.readArrayLength(StaticSerialization.java:102)
>       at 
> org.apache.geode.internal.serialization.StaticSerialization.readByteArray(StaticSerialization.java:321)
>       at 
> org.apache.geode.internal.serialization.StaticSerialization.readInetAddress(StaticSerialization.java:254)
>       at 
> org.apache.geode.DataSerializer.readInetAddress(DataSerializer.java:463)
>       at 
> org.apache.geode.distributed.internal.membership.InternalDistributedMember._readEssentialData(InternalDistributedMember.java:1085)
>       at 
> org.apache.geode.distributed.internal.membership.InternalDistributedMember.readEssentialData(InternalDistributedMember.java:1079)
>       at 
> org.apache.geode.internal.cache.versions.VMVersionTag.readMember(VMVersionTag.java:58)
>       at 
> org.apache.geode.internal.cache.versions.VMVersionTag.readMember(VMVersionTag.java:31)
>       at 
> org.apache.geode.internal.cache.versions.VersionTag.fromData(VersionTag.java:412)
>       at 
> org.apache.geode.internal.serialization.DSFIDSerializerImpl.invokeFromData(DSFIDSerializerImpl.java:300)
>       at 
> org.apache.geode.internal.serialization.DSFIDSerializerImpl.create(DSFIDSerializerImpl.java:347)
>       at org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:1018)
>       at 
> org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2639)
>       at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2864)
>       at 
> org.apache.geode.internal.cache.partitioned.PutMessage$PutReplyMessage.fromData(PutMessage.java:940)
>       at 
> org.apache.geode.internal.serialization.DSFIDSerializerImpl.invokeFromData(DSFIDSerializerImpl.java:300)
>       at 
> org.apache.geode.internal.serialization.DSFIDSerializerImpl.create(DSFIDSerializerImpl.java:347)
>       at org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:1018)
>       at 
> org.apache.geode.internal.InternalDataSerializer.readDSFID(InternalDataSerializer.java:2520)
>       at 
> org.apache.geode.internal.InternalDataSerializer.readDSFID(InternalDataSerializer.java:2534)
>       at 
> org.apache.geode.internal.tcp.Connection.readMessage(Connection.java:3118)
>       at 
> org.apache.geode.internal.tcp.Connection.processInputBuffer(Connection.java:2927)
>       at 
> org.apache.geode.internal.tcp.Connection.readMessages(Connection.java:1752)
>       at org.apache.geode.internal.tcp.Connection.run(Connection.java:1584)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>       at java.lang.Thread.run(Thread.java:748)
> {noformat}
> This code is trying to read a "previous member ID" for the version tag but 
> there isn't one.  The decision to write one or not comes from this code:
> {code}
>     if (this.previousMemberID != null
>         && (this.previousMemberID != this.memberID || !includeMember)) {
>       writeMember(this.previousMemberID, out);
>     }
> {code}
> but flags have already been written telling deserialization code whether or 
> not to read this field:
> {code}
>     if (this.previousMemberID != null) {
>       flags |= HAS_PREVIOUS_MEMBER_ID;
>       if (this.previousMemberID == this.memberID && includeMember) {
>         flags |= DUPLICATE_MEMBER_IDS;
>       }
>     }
> {code}
> If the previousMemberID is canonicalized while this method is being processed 
> the flags may not agree with the decision made by the code invoking 
> writeMember().  That code ought to be changed to respect the flags that were 
> set earlier in the method.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to