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

Mikhail Petrov commented on IGNITE-20688:
-----------------------------------------

Merged to the master branch.

[~alexpl] Thank you a lot for the review!

> Java Thin Client - Error while deserializing Collection
> -------------------------------------------------------
>
>                 Key: IGNITE-20688
>                 URL: https://issues.apache.org/jira/browse/IGNITE-20688
>             Project: Ignite
>          Issue Type: Bug
>          Components: binary, thin client
>    Affects Versions: 2.9, 2.10, 2.12, 2.13, 2.14, 2.15
>            Reporter: Rahul Mohan
>            Assignee: Mikhail Petrov
>            Priority: Critical
>              Labels: ise
>             Fix For: 2.17
>
>         Attachments: image001.png
>
>          Time Spent: 1.5h
>  Remaining Estimate: 0h
>
> I have encountered an issue in deserializing cache values which are of 
> Collection type.
> The issue occurs if a field in different objects  within the  collection 
> points  to the same reference.
> *Versions:*
> org.apache.ignite:ignite-core:2.9.0 to org.apache.ignite:ignite-core:2.15.0
>  
> {code:java}
> Person.java
> public class Person implements Serializable {
>     private String id;
>     private String firstName;
>     private String lastName;
>     private double salary;
>     private String country;
>     private String deleted;
>     private Set<String> accounts;
> }
> Client
>             ClientCacheConfiguration cacheCfg = new 
> ClientCacheConfiguration().setName(cacheName).
>                     setCacheMode(CacheMode.REPLICATED).
>                     
> setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
>  
>             cache = client.getOrCreateCache(cacheCfg);
>  
>             Set<String> set = new HashSet<>();
>             set.add("1");
>  
>             List<Person> persons = new ArrayList<>();
>             persons.add(new Person("105286a4","Jack","Smith",10000f, 
> "USA","false", set));
>             persons.add(new Person("98545b0fd3af","John", "Doe", 500000f, 
> "Australia","false", null));
>             persons.add(new Person("98545b0fd3afd","Hari","M",400000f, 
> "India", null, null));
>             persons.add(new 
> Person("985488b0fd3ae","Bugs","Bunny",300000f,"Wabbit Land ", null, set));
>             cache.put("group1", value) // Write collection to cache
>     
>             List<Person> persons = (List<Person>) cache.get("group1"); // Get 
> from cache, Exception here {code}
>     
> *Exception:*
> {code:java}
> class org.apache.ignite.binary.BinaryObjectException: Failed to deserialize 
> object [typeName=com.ignite.example.model.Person]
>                 at 
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:927)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1764)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>                 at 
> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:316)
>                 at 
> org.apache.ignite.internal.client.thin.ClientBinaryMarshaller.deserialize(ClientBinaryMarshaller.java:74)
>                 at 
> org.apache.ignite.internal.client.thin.ClientUtils.unwrapBinary(ClientUtils.java:557)
>                 at 
> org.apache.ignite.internal.client.thin.ClientUtils.unwrapCollection(ClientUtils.java:578)
>                 at 
> org.apache.ignite.internal.client.thin.ClientUtils.unwrapBinary(ClientUtils.java:562)
>                 at 
> org.apache.ignite.internal.client.thin.ClientUtils.readObject(ClientUtils.java:546)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientCache.readObject(TcpClientCache.java:556)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientCache.readObject(TcpClientCache.java:561)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientCache$$Lambda$395/1950117092.apply(Unknown
>  Source)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientChannel.receive(TcpClientChannel.java:284)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientChannel.service(TcpClientChannel.java:219)
>                 at 
> org.apache.ignite.internal.client.thin.ReliableChannel.service(ReliableChannel.java:198)
>                 at 
> org.apache.ignite.internal.client.thin.ReliableChannel.affinityService(ReliableChannel.java:261)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientCache.cacheSingleKeyOperation(TcpClientCache.java:508)
>                 at 
> org.apache.ignite.internal.client.thin.TcpClientCache.get(TcpClientCache.java:111)
>                 at 
> com.ignite.example.service.ApacheIgniteService.printAllKeys(ApacheIgniteService.java:117)
>                 at 
> com.ignite.example.service.ApacheIgniteService.init(ApacheIgniteService.java:103)
>                 at 
> com.ignite.example.IgniteCacheExampleApplication.run(IgniteCacheExampleApplication.java:22)
>                 at 
> org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768)
>                 at 
> org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752)
>                 at 
> org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
>                 at 
> com.ignite.example.IgniteCacheExampleApplication.main(IgniteCacheExampleApplication.java:17)
> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to 
> read field [name=accounts]
>                 at 
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
>                 at 
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:888)
>                 ... 24 more
> Caused by: java.lang.ArrayIndexOutOfBoundsException: -430
>                 at 
> org.apache.ignite.internal.binary.streams.BinaryHeapInputStream.readByteAndShift(BinaryHeapInputStream.java:120)
>                 at 
> org.apache.ignite.internal.binary.streams.BinaryAbstractInputStream.readByte(BinaryAbstractInputStream.java:37)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>(BinaryReaderExImpl.java:219)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>(BinaryReaderExImpl.java:186)
>                 at 
> org.apache.ignite.internal.binary.BinaryUtils.doReadObject(BinaryUtils.java:1801)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1748)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>                 at 
> org.apache.ignite.internal.binary.BinaryReaderExImpl.readField(BinaryReaderExImpl.java:1978)
>                 at 
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
>                 at 
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
>  {code}
> *Analysis*
> The exception occurs due to a OutOfBounds read happening in
> obj = BinaryUtils.doReadObject(in, ctx, ldr, this);  
> This is because *handlePos* points to a location in the ByteBuffer which is 
> outside that of the Buffer in the current object resulting in a negative 
> offset (java.lang.ArrayIndexOutOfBoundsException: {*}-430{*})
> {{!image001.png!}}
> The serialization works and the  Byte array response returned from the server 
> is the same as that was written. It's the way HANDLE types within a 
> Collection are read  that's probably causing this.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to