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