[
https://issues.apache.org/jira/browse/IGNITE-20688?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17778438#comment-17778438
]
Mikhail Petrov commented on IGNITE-20688:
-----------------------------------------
[~rahmo] Thank you for reporting the issue!
The information you provided is enough to reproduce and confirm the problem. We
are doing our best to fix it as soon as possible.
As a WA you can wrap List<Person> that you put in the cache with some other
class e.g.
{code:java}
public static class Organization implements Serializable {
private List<Person> employees;
}
{code}
> 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: Major
> Attachments: image001.png
>
>
> 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)