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
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>
> >>>>>
> >>>
> >>
> >>
>
>

Reply via email to