Hello, Igniters. I've prepared implementation of support of BinaryArray. Please, join the review.
Ticket - https://issues.apache.org/jira/browse/IGNITE-14742 PR - https://github.com/apache/ignite/pull/9490 ср, 19 мая 2021 г. в 14:44, Ilya Kasnacheev <ilya.kasnach...@gmail.com>: > 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 > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>> > > >>>> > > >>>> > > >> > > >> > > > > >