You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Bruce Schuchardt (Jira)" <ji...@apache.org> on 2019/09/20 20:16:00 UTC

[jira] [Resolved] (GEODE-7219) BufferUnderflowException in PutReplyMessage deserialization

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

Bruce Schuchardt resolved GEODE-7219.
-------------------------------------
    Fix Version/s: 1.11.0
       Resolution: Fixed

> 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 Schuchardt
>            Assignee: Bruce 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)