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

Reply via email to