Hello! We don't have to do it in toBinary() - we may preserve its behavior if you like, and only do that transition for Cache API, where additional support may be added to e.g. org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl
Regards, -- Ilya Kasnacheev ср, 19 мая 2021 г. в 14:23, Nikolay Izhikov <nizhi...@apache.org>: > Ilya. > > Actually, current behaviour described even in documentation [1] > > > > Note that not all objects are converted to the binary object format. The > following classes are never converted (e.g., the toBinary(Object) method > returns the original object, and instances of these classes are stored > without changes): > ... > > ... arrays of objects (but the objects inside them are reconverted if > they are binary) > > [1] > https://ignite.apache.org/docs/latest/key-value-api/binary-objects#enabling-binary-mode-for-caches > > > 19 мая 2021 г., в 14:12, Ilya Kasnacheev <ilya.kasnach...@gmail.com> > написал(а): > > > > Hello! > > > > Why do you need to take compatibility into account here at all? > > You can start writing entries to cache in new format while reading both > old > > and new format. > > > > I consider returning Object[] instead of ConcreteType[] a bug so it's > > totally OK to start returning the "better" ConcreteType[] instead. > > > > I think you can just fix the bug while preserving accessibility of old > > (pre-bugfix) data as it was pre-2.11. > > > > Regards, > > -- > > Ilya Kasnacheev > > > > > > ср, 19 мая 2021 г. в 14:08, Nikolay Izhikov <nizhi...@apache.org>: > > > >> Ilya, > >> > >>> Maybe we should just automate that, e.g., whenever user stores Type[], > >> always store one-field ArrayWrapper object, and automatically unwrap it > on > >> get() > >> > >> Yes, I’m talking about this opportunity from the beginning of the > thread. > >> > >>> 1. Implement binary serialization that correctly Ser and Deser array > >> using some kind of the wrapper (BinaryArrayWrapper). > >> > >> > >>> 19 мая 2021 г., в 14:05, Ilya Kasnacheev <ilya.kasnach...@gmail.com> > >> написал(а): > >>> > >>> Hello! > >>> > >>> Yes, it does not look pretty, I agree. But I'm saying that I've not > >>> encountered this issue on the user list before, and it can probably be > >>> easily countered by storing some one-field ArrayWrapper object in the > >> cache > >>> as value. > >>> > >>> Maybe we should just automate that, e.g., whenever user stores Type[], > >>> always store one-field ArrayWrapper object, and automatically unwrap it > >> on > >>> get() > >>> This way we may not even need any changes to storage format, if binary > >>> marshaller does not mind. > >>> > >>> Regards, > >>> > >>> Regards, > >>> -- > >>> Ilya Kasnacheev > >>> > >>> > >>> ср, 19 мая 2021 г. в 13:33, Nikolay Izhikov <nizhi...@apache.org>: > >>> > >>>> Igniters. > >>>> > >>>> Just to clarify the issue: > >>>> > >>>> ``` > >>>> public class BinaryObjectTest extends GridCommonAbstractTest { > >>>> /** */ > >>>> @Test > >>>> public void testArray() throws Exception { > >>>> Ignite ign = startGrid(); > >>>> > >>>> IgniteCache<Integer, TestClass1[]> cache = > >>>> ign.createCache("my-cache"); > >>>> > >>>> cache.put(1, new TestClass1[] {new TestClass1(), new > >>>> TestClass1()}); > >>>> TestClass1[] obj = cache.get(1); //This will fail with > >>>> ClassCastException. > >>>> > >>>> assertEquals(TestClass1[].class, obj.getClass()); > >>>> } > >>>> } > >>>> ``` > >>>> > >>>>> 19 мая 2021 г., в 13:04, Nikolay Izhikov <nizhikov....@gmail.com> > >>>> написал(а): > >>>>> > >>>>> Thanks, Ilya. > >>>>> > >>>>> Can you put more context on this? > >>>>> I don’t familiar with these issues. > >>>>> > >>>>>> 19 мая 2021 г., в 13:02, Ilya Kasnacheev <ilya.kasnach...@gmail.com > > > >>>> написал(а): > >>>>>> > >>>>>> Hello! > >>>>>> > >>>>>> Obvious issues are Lazy SQL, Event Driven Services, Sort Binary > Object > >>>>>> Fields. > >>>>>> > >>>>>> Regards, > >>>>>> -- > >>>>>> Ilya Kasnacheev > >>>>>> > >>>>>> > >>>>>> ср, 19 мая 2021 г. в 12:56, Nikolay Izhikov <nizhi...@apache.org>: > >>>>>> > >>>>>>> Hello, > >>>>>>> > >>>>>>>> However, for internal platform and services implementations we > >> should > >>>>>>> fix the root cause: > >>>>>>>> avoid extra deserialization->serialization pass completely. > >>>>>>>> This will also improve performance. > >>>>>>> > >>>>>>> Pavel, thanks for the feedback. > >>>>>>> If I understand correctly, your suggestion is to know data size at > >> the > >>>>>>> start of reading service parameters. > >>>>>>> Is it correct? > >>>>>>> > >>>>>>> Right now, when the service method invoked we pass an array of > >>>> parameters > >>>>>>> through platform reader/writer machinery. > >>>>>>> On java side parameters read one by one and we don’t know the size > of > >>>> the > >>>>>>> data on the read start. > >>>>>>> > >>>>>>> AFAICU, this will require x2 memory on the .Net or thin > client-side. > >>>>>>> > >>>>>>> > >>>>>>> > >>>> > >> > https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java#L289 > >>>>>>> > >>>>>>> > >>>>>>>> if we are to break compatibility, I would like to see it done for > >> some > >>>>>>> really common pain point. > >>>>>>> > >>>>>>> Ilya, can you, please, provide a list of common issues with Ignite > >> that > >>>>>>> can be resolved > >>>>>>> only with compatibility breakage? > >>>>>>> > >>>>>>>> 4 мая 2021 г., в 12:58, Ilya Kasnacheev < > ilya.kasnach...@gmail.com> > >>>>>>> написал(а): > >>>>>>>> > >>>>>>>> Hello! > >>>>>>>> > >>>>>>>> If we really decide to break some compatibility then Array to > >>>>>>> BinaryObject > >>>>>>>> serialization will be very, very low on my personal list. > >>>>>>>> > >>>>>>>> I just don't see how this issue is relevant. I have been reading > and > >>>>>>>> answering user list for a few years now, and I don't remember a > >> single > >>>>>>>> question about storing ConcreteType[] as value and complaining > about > >>>> type > >>>>>>>> information loss. > >>>>>>>> > >>>>>>>> If you have a good scenario how do we keep persistent store binary > >>>>>>>> compatibility here, without adding a lot of new code and still > >>>> checking > >>>>>>> for > >>>>>>>> both old and new approaches - you can go forward for sure. > >>>>>>>> > >>>>>>>> However, it does seem questionable where we have a new wrapper > class > >>>>>>>> specifically for top level arrays. You can have this wrapper in > your > >>>> own > >>>>>>>> client code and it should work OK. > >>>>>>>> > >>>>>>>> Bottom line, if we are to break compatibility, I would like to see > >> it > >>>>>>> done > >>>>>>>> for some really common pain point. > >>>>>>>> > >>>>>>>> Regards, > >>>>>>>> -- > >>>>>>>> Ilya Kasnacheev > >>>>>>>> > >>>>>>>> > >>>>>>>> пт, 30 апр. 2021 г. в 17:34, Nikolay Izhikov <nizhi...@apache.org > >: > >>>>>>>> > >>>>>>>>> Hello, Ilya. > >>>>>>>>> > >>>>>>>>> Thanks for the feedback! > >>>>>>>>> > >>>>>>>>>> For me it sounds like something we would like to do in 3.0 > >>>>>>>>> > >>>>>>>>> Ignite 3 is a very long way to go, so I prefer to target this fix > >> in > >>>>>>>>> Ignite 2.x. > >>>>>>>>> > >>>>>>>>>> I think making it default "true" is a breaking change and is not > >>>>>>>>> possible in a minor release > >>>>>>>>> > >>>>>>>>> Yes, you are correct it is a breaking change. > >>>>>>>>> It seems for me, we all agreed that breaking changes are possible > >> in > >>>>>>> minor > >>>>>>>>> releases. > >>>>>>>>> > >>>>>>>>> Anyway, if we will decide do not to enable this feature by > default > >>>> it’s > >>>>>>> OK > >>>>>>>>> for me. > >>>>>>>>> We still can implement it and improve the binary SerDe mechanism. > >>>>>>>>> > >>>>>>>>> > >>>>>>>>>> 30 апр. 2021 г., в 17:23, Ilya Kasnacheev < > >>>> ilya.kasnach...@gmail.com> > >>>>>>>>> написал(а): > >>>>>>>>>> > >>>>>>>>>> Hello! > >>>>>>>>>> > >>>>>>>>>> For me it sounds like something we would like to do in 3.0 (if > >>>> indeed > >>>>>>> it > >>>>>>>>>> will have arrays as possible value (or key) type), but doing it > in > >>>> 2.x > >>>>>>>>>> raises concerns whether it has enough time left to stabilize. > >>>>>>>>>> > >>>>>>>>>> Also, I think making it default "true" is a breaking change and > is > >>>> not > >>>>>>>>>> possible in a minor release, case in point, > >>>>>>>>>> IGNITE_BINARY_SORT_OBJECT_FIELDS is still waiting for 3.0 and it > >> is > >>>>>>> less > >>>>>>>>>> destructive. > >>>>>>>>>> > >>>>>>>>>> Of course I would also like to hear what other community members > >>>> think. > >>>>>>>>>> > >>>>>>>>>> Regards, > >>>>>>>>>> -- > >>>>>>>>>> Ilya Kasnacheev > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> пт, 30 апр. 2021 г. в 17:16, Nikolay Izhikov < > nizhi...@apache.org > >>> : > >>>>>>>>>> > >>>>>>>>>>> Igniters, > >>>>>>>>>>> > >>>>>>>>>>> Want to clarify my proposal about new array store format. > >>>>>>>>>>> I think we should store array in special binary wrapper that > will > >>>> keep > >>>>>>>>>>> original component type > >>>>>>>>>>> > >>>>>>>>>>> ``` > >>>>>>>>>>> public class BinaryArrayWrapper implements BinaryObjectEx, > >>>>>>>>> Externalizable { > >>>>>>>>>>> /** Type ID. */ > >>>>>>>>>>> private int compTypeId; > >>>>>>>>>>> > >>>>>>>>>>> /** Raw data. */ > >>>>>>>>>>> private String compClsName; > >>>>>>>>>>> > >>>>>>>>>>> /** Value. */ > >>>>>>>>>>> private Object[] arr; > >>>>>>>>>>> > >>>>>>>>>>> // Further implementation. > >>>>>>>>>>> } > >>>>>>>>>>> ``` > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>>> 30 апр. 2021 г., в 16:31, Nikolay Izhikov < > >> nizhikov....@gmail.com > >>>>> > >>>>>>>>>>> написал(а): > >>>>>>>>>>>> > >>>>>>>>>>>> Hello, Igniters. > >>>>>>>>>>>> > >>>>>>>>>>>> Currently, binary marshaller works as follows(Say, we have a > >> class > >>>>>>>>>>> `User` then): > >>>>>>>>>>>> > >>>>>>>>>>>> IgniteBinary#toBinary(User)` -> BinaryObject > >>>>>>>>>>>> IgniteBinary#toBinary(User[])` -> Object[] > >>>>>>>>>>>> IgniteBinary#toBinary(Object[])` -> Object[] > >>>>>>>>>>>> > >>>>>>>>>>>> This means, that we lose array component type information > during > >>>>>>> binary > >>>>>>>>>>> serialization. > >>>>>>>>>>>> AFAIK, it’s a design choice made during binary infrastructure > >>>>>>>>>>> development. > >>>>>>>>>>>> > >>>>>>>>>>>> This lead to the following disadvantages: > >>>>>>>>>>>> > >>>>>>>>>>>> 1. `IgniteBinary` can’t be used as a universal SerDe > mechanism. > >>>>>>>>>>>> 2. Ignite internals(service grid, .Net calls) contains many > >> tweaks > >>>>>>> and > >>>>>>>>>>> hacks to deal with custom user array and still has many issues > >> [1] > >>>>>>>>>>>> > >>>>>>>>>>>> I propose to make breaking changes and fix the custom user > array > >>>> SeDe > >>>>>>>>> as > >>>>>>>>>>> follows: > >>>>>>>>>>>> > >>>>>>>>>>>> 1. Implement binary serialization that correctly Ser and Deser > >>>>>>>>>>> array using some kind of the wrapper (BinaryArrayWrapper). > >>>>>>>>>>>> > >>>>>>>>>>>> IgniteBinary#toBinary(User)` -> BinaryObject > >>>>>>>>>>>> IgniteBinary#toBinary(User[])` -> BinaryObject > >>>>>>>>>>>> IgniteBinary#toBinary(Object[])` -> BinaryObject > >>>>>>>>>>>> > >>>>>>>>>>>> 2. Introduce system flag `IGNITE_USE_BINARY_ARRAY` that > enables > >>>>>>>>>>> correct SerDe of arrays. The default value is false to keep > >>>> backward > >>>>>>>>>>> compatibility in the next Ignite release(2.11). > >>>>>>>>>>>> > >>>>>>>>>>>> 3. Set `IGNITE_USE_BINARY_ARRAY` to `true` in the ongoing > >>>> Ignite > >>>>>>>>>>> releases (2.12). > >>>>>>>>>>>> > >>>>>>>>>>>> WDYT? > >>>>>>>>>>>> > >>>>>>>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-14299 > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>> > >>>>>>> > >>>>> > >>>> > >>>> > >> > >> > >