Hi,
Currently we are using Apache Ignite for caching huge amount of data (> 500 GB)
and performing some computations over it. One of our computations required
returning big chunk of data (> 4GB after serialization) from the compute node
to the requester, which caused integer overflow while serialization.
Exception:
NFO | jvm 3 | 2016/07/07 11:29:55 | Caused by:
java.lang.NegativeArraySizeException: null
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.util.io.GridUnsafeDataOutput.requestFreeSize(GridUnsafeDataOutput.java:153)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.util.io.GridUnsafeDataOutput.writeInt(GridUnsafeDataOutput.java:352)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeInt(GridOptimizedObjectOutputStream.java:602)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeArrayList(GridOptimizedObjectOutputStream.java:320)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:779)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:201)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeFields(GridOptimizedObjectOutputStream.java:485)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:306)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:829)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:201)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeArrayList(GridOptimizedObjectOutputStream.java:323)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:779)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:201)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeFields(GridOptimizedObjectOutputStream.java:485)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:306)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:829)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:201)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeArrayList(GridOptimizedObjectOutputStream.java:323)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:779)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:201)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeFields(GridOptimizedObjectOutputStream.java:485)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.defaultWriteObject(GridOptimizedObjectOutputStream.java:655)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
java.util.Collections$SynchronizedCollection.writeObject(Collections.java:2081)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
java.lang.reflect.Method.invoke(Method.java:498)
INFO | jvm 3 | 2016/07/07 11:29:55 | at
org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:296)
INFO | jvm 3 | 2016/07/07 11:29:55 | ... 22 common frames omitted
We were using GridGain 6.2 and currently moved to Apache Ignite 1.5. I checked
the code and found that part of the code responsible for doing the
serialization part is the same, so the problem will not be solved in Apache
Ignite.
Class OptimizedMarshaller.java
/** {@inheritDoc} */
@Override public byte[] marshal(@Nullable Object obj) throws
IgniteCheckedException {
OptimizedObjectOutputStream objOut = null;
try {
objOut = OptimizedObjectStreamRegistry.out();
objOut.context(clsMap, ctx, mapper, requireSer);
objOut.writeObject(obj);
return objOut.out().array();
}
catch (IOException e) {
throw new IgniteCheckedException("Failed to serialize object: " +
obj, e);
}
finally {
OptimizedObjectStreamRegistry.closeOut(objOut);
}
}
The problem with that code that the APIs force using byte[] for serialization
which means we can't return objects that can be serialized with more than
byte[INT_MAX].
The question is: Does Apache Ignite provide out of the box streaming
serialization between nodes?
Thanks,
Mohamed Sahmoud
**********************************************************************
The clear choice for graduates – No.1 in the 2015 Top 100 Australian Graduate
Employers Survey
Prepared by the Australian Financial Review in association with GradConnection
Proud winner of the 2014 Human Rights Business Award for our commitment to
Reconciliation
*******************************************************************************************************************
The information in this e-mail is confidential and may be legally privileged.
It is intended solely for the addressee. Access to this e-mail by anyone else
is unauthorised. If you have received this communication in error, please
notify us immediately by return e-mail with the subject heading "Received in
error" or telephone +61 2 93357000, then delete the email and destroy any
copies of it. If you are not the intended recipient, any disclosure, copying,
distribution or any action taken or omitted to be taken in reliance on it, is
prohibited and may be unlawful. Any opinions or advice contained in this e-mail
are subject to the terms and conditions expressed in the governing KPMG client
engagement letter. Opinions, conclusions and other information in this e-mail
and any attachments that do not relate to the official business of the firm are
neither given nor endorsed by it.
KPMG cannot guarantee that e-mail communications are secure or error-free, as
information could be intercepted, corrupted, amended, lost, destroyed, arrive
late or incomplete, or contain viruses.
KPMG, an Australian partnership and a member firm of the KPMG network of
independent member firms affiliated with KPMG International, a Swiss
cooperative. KPMG International provides no services to clients.
Liability limited by a scheme approved under Professional Standards Legislation.
*******************************************************************************************************************