Hello, Pavel.

Agree. Will implement it. 

> 13 янв. 2021 г., в 20:28, Pavel Tupitsyn <ptupit...@apache.org> написал(а):
> 
>> I propose to implicitly register classes only in the case they are sent
> to the Java side.
> 
> Ok, I guess we can do this when all of the following is true
> - We are inside ExecuteJavaTask or Java service call
> - FQN mapper is used (default or explicit)
> - There is no BinaryIdMapper on .NET or Java side
> 
> 
> On Wed, Jan 13, 2021 at 6:30 PM Nikolay Izhikov <nizhi...@apache.org> wrote:
> 
>> Pavel.
>> 
>>> Yes, but they are registered separately for .NET and Java, please see
>> how MarshallerContextImpl stores typeId->typeName mappings.
>> 
>> This will not change. We still will have separate type registration.
>> 
>>> With the proposal we put all class names in the same pile.
>> 
>> Implementation of type registration will not be changed.
>> What I propose is to simplify user life in the exact places we can do it
>> for free.
>> 
>>> Now imagine that the user has a cluster with C# and Java clients.
>>> C# client uses class "foo.bar.Aa" for Compute,
>>> Java client uses class "foo.bar.BB" for Services - independent use
>> cases,
>>> all is well.
>> 
>> I propose to implicitly register classes only in the case they are sent to
>> the Java side.
>> So, for all classes that is used only in .Net nothing will change.
>> 
>> 
>>> 13 янв. 2021 г., в 15:14, Pavel Tupitsyn <ptupit...@apache.org>
>> написал(а):
>>> 
>>>> Classes MUST be registered to be used in compute or cache.
>>> 
>>> Yes, but they are registered separately for .NET and Java,
>>> please see how MarshallerContextImpl stores typeId->typeName mappings.
>>> 
>>> With the proposal we put all class names in the same pile.
>>> 
>>> Now imagine that the user has a cluster with C# and Java clients.
>>> C# client uses class "foo.bar.Aa" for Compute,
>>> Java client uses class "foo.bar.BB" for Services - independent use
>> cases,
>>> all is well.
>>> 
>>> As soon as we put all class names in the same map, the app breaks,
>>> because "foo.bar.Aa" and "foo.bar.BB" have the same hash code,
>>> and DuplicateTypeIdException is thrown by Ignite.
>>> 
>>> On Wed, Jan 13, 2021 at 1:54 PM Nikolay Izhikov <nizhi...@apache.org>
>> wrote:
>>> 
>>>> Hello, Pavel.
>>>> 
>>>>> Imagine that some Ignite user has lots of .NET and Java classes being
>>>> stored in cache, used in compute,
>>>> 
>>>> Classes MUST be registered to be used in compute or cache.
>>>> So, in your example, user registered classes by hand, already.
>>>> 
>>>>> Let's add a flag like BinaryConfiguration.AssumeSameJavaTypeNames,
>>>> 
>>>> We already have this «flag».
>>>> It a default INameMapper implementation that assumes we use the same
>> class
>>>> names both in Java and .Net.
>>>> 
>>>>> This is not up for discussion, we do not break compatibility like this.
>>>> 
>>>> Sorry, I don’t see compatibility issues in the proposal.
>>>> Can you, please, provide an example?
>>>> 
>>>>> 13 янв. 2021 г., в 13:46, Pavel Tupitsyn <ptupit...@apache.org>
>>>> написал(а):
>>>>> 
>>>>> Nikolay,
>>>>> 
>>>>> I agree with your proposal, with one addition:
>>>>> this behavior must be disabled by default for compatibility reasons.
>>>>> 
>>>>> Imagine that some Ignite user has lots of .NET and Java classes being
>>>>> stored in cache,
>>>>> used in compute, etc. Now with the proposal implemented, all .NET
>> classes
>>>>> are registered
>>>>> as Java classes too, which has a potential for hash code collisions,
>>>>> resulting in DuplicateTypeIdException.
>>>>> 
>>>>> So the user can't upgrade to 2.11, their app does not work anymore,
>> which
>>>>> is not acceptable.
>>>>> This is not up for discussion, we do not break compatibility like this.
>>>>> 
>>>>> Let's add a flag like BinaryConfiguration.AssumeSameJavaTypeNames,
>>>>> which enables the behavior globally and both ways:
>>>>> all type names become shared across all platforms in
>>>> MarshallerContextImpl.
>>>>> 
>>>>> 
>>>>> On Wed, Jan 13, 2021 at 11:21 AM Nikolay Izhikov <nizhi...@apache.org>
>>>>> wrote:
>>>>> 
>>>>>> Hello, Pavel
>>>>>> 
>>>>>> My proposal is the following:
>>>>>> 
>>>>>> *When Ignite configured with FQN NameMapper.*
>>>>>> And  user invokes
>>>>>> 
>>>>>> 1. Service method from .Net to Java.
>>>>>> 2. Compute methods `ExecuteJavaTask`, `ExecuteJavaTaskAsync`
>>>>>> 3. Cache operations.
>>>>>> 
>>>>>> Ignite should implicitly register types both for .Net and Java
>> platform.
>>>>>> 
>>>>>> =====
>>>>>> My intentions is to simplify usage of the Ignite .Net platform by
>>>>>> eliminating necessity of BinaryConfiguration in .Net.
>>>>>> 
>>>>>> Approach when user should modify Ignite configuration on both sides
>> Java
>>>>>> and .Net every time he use new class as a service parameter looks
>> ugly,
>>>> for
>>>>>> me.
>>>>>> 
>>>>>> You can see an example of my idea in services test [1]
>>>>>> In current release, user forced to enlist each type in configuration.
>>>>>> Now, you just deploy Java service and use it.
>>>>>> 
>>>>>> Please, Note:
>>>>>> 
>>>>>> 1. FQN NameMapper is a default value.
>>>>>> 2. FQN NameMapper requires from the user to have exactly same names
>> for
>>>>>> custom binary types in Java and .Net.
>>>>>> 3. Improvals for Services in master, already.
>>>>>> 
>>>>>> [1]
>>>>>> 
>>>> 
>> https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServiceTypeAutoResolveTest.cs#L146
>>>>>> 
>>>>>>> 13 янв. 2021 г., в 10:13, Pavel Tupitsyn <ptupit...@apache.org>
>>>>>> написал(а):
>>>>>>> 
>>>>>>> Nikolay,
>>>>>>> 
>>>>>>> As I understand, you insist on changing the default behavior, is this
>>>>>>> correct?
>>>>>>> 
>>>>>>> 
>>>>>>> On Tue, Jan 12, 2021 at 9:51 PM Nikolay Izhikov <nizhi...@apache.org
>>> 
>>>>>> wrote:
>>>>>>> 
>>>>>>>> Hello, Igor, Pavel.
>>>>>>>> 
>>>>>>>> Thanks for the feedback
>>>>>>>> 
>>>>>>>>> Agree with Pavel, this should be disabled by default.
>>>>>>>> 
>>>>>>>> Right now, Ignite, by default, forcing users to enlist every single
>>>>>> value
>>>>>>>> object they have in project in the config.
>>>>>>>> Do you think it’s a right way to go?
>>>>>>>> 
>>>>>>>>> To me it looks pretty dangerous as users do not explicitly control
>>>>>>>> what’s going to be registered and it could lead to hard-to-debug
>>>>>> mistakes
>>>>>>>> when wrong classes get registered or with wrong names.
>>>>>>>> 
>>>>>>>> Approach with transparent type registration implemented in every RPC
>>>>>>>> framework I know.
>>>>>>>> I think user expect it from the modern software.
>>>>>>>> Can you, please, highlight dangerous part of the approach?
>>>>>>>> 
>>>>>>>>> Wouldn't
>>>>>>>>> it be more reasonable to only register those which are used with
>> Java
>>>>>>>>> services?
>>>>>>>> 
>>>>>>>> Correct. Will do it.
>>>>>>>> 
>>>>>>>>> Registering every .NET type as a Java type can lead to typeId
>>>>>> collisions
>>>>>>>> and break existing user code,
>>>>>>>> 
>>>>>>>> For Service and Compute API binary type registration both in Java
>> and
>>>>>> .Net
>>>>>>>> will happen anyway.
>>>>>>>> It’s required just to get things work.
>>>>>>>> 
>>>>>>>>> 12 янв. 2021 г., в 20:31, Igor Sapego <isap...@apache.org>
>>>> написал(а):
>>>>>>>>> 
>>>>>>>>> Agree with Pavel, this should be disabled by default.
>>>>>>>>> 
>>>>>>>>> To me it looks pretty dangerous as users do not explicitly control
>>>>>> what's
>>>>>>>>> going to be
>>>>>>>>> registered and it could lead to hard-to-debug mistakes when wrong
>>>>>> classes
>>>>>>>>> get
>>>>>>>>> registered or with wrong names. Also it can be hard to use with
>>>> classes
>>>>>>>>> that should
>>>>>>>>> not be registered at all, which is often the case because not
>>>> everyone
>>>>>>>> use
>>>>>>>>> .NET client
>>>>>>>>> with Java services.
>>>>>>>>> 
>>>>>>>>> To me it looks familiar to another of our features - peer class
>>>>>> loading,
>>>>>>>>> which is disabled
>>>>>>>>> by default for similar reasons.
>>>>>>>>> 
>>>>>>>>> Also, why register types which are used as method arguments for any
>>>>>>>>> service? Wouldn't
>>>>>>>>> it be more reasonable to only register those which are used with
>> Java
>>>>>>>>> services?
>>>>>>>>> 
>>>>>>>>> Best Regards,
>>>>>>>>> Igor
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Tue, Jan 12, 2021 at 7:35 PM Pavel Tupitsyn <
>> ptupit...@apache.org
>>>>> 
>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Nikolay,
>>>>>>>>>> 
>>>>>>>>>> I think this behavior should be opt-in - let's add a flag to
>>>>>>>>>> BinaryConfiguration.
>>>>>>>>>> Registering every .NET type as a Java type can lead to typeId
>>>>>> collisions
>>>>>>>>>> and break existing user code,
>>>>>>>>>> so we can't enable this by default.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Ignite stores typeId -> className mappings separately for Java and
>>>>>> .NET
>>>>>>>>>> [1].
>>>>>>>>>> Separate maps were introduced because C# and Java have different
>>>>>> naming
>>>>>>>>>> conventions,
>>>>>>>>>> typically you have org.foo.bar.Person in Java and Foo.Bar.Person
>> in
>>>>>>>> .NET,
>>>>>>>>>> so we allow the users to map two different type names to the same
>>>>>> typeId
>>>>>>>>>> with a custom name or id mapper.
>>>>>>>>>> 
>>>>>>>>>> This proposal says we should always put Foo.Bar.Person from .NET
>> to
>>>>>> the
>>>>>>>>>> Java mapping,
>>>>>>>>>> in the hope that there is a class with that name in Java, which
>> is a
>>>>>>>> very
>>>>>>>>>> rare use case.
>>>>>>>>>> 
>>>>>>>>>> [1]
>>>>>>>>>> 
>>>>>> 
>> org.apache.ignite.internal.MarshallerContextImpl#registerClassName(byte,
>>>>>>>>>> int, java.lang.String, boolean)
>>>>>>>>>> 
>>>>>>>>>> On Tue, Jan 12, 2021 at 4:56 PM Nikolay Izhikov <
>>>> nizhi...@apache.org>
>>>>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> Hello, Igniters.
>>>>>>>>>>> 
>>>>>>>>>>> Currently, in case of usage .Net platform client it’s required
>> for
>>>>>> the
>>>>>>>>>>> user to explicitly register each custom type.
>>>>>>>>>>> 
>>>>>>>>>>> ```
>>>>>>>>>>> _marsh = new Marshaller(new BinaryConfiguration
>>>>>>>>>>> {
>>>>>>>>>>> TypeConfigurations = new List<BinaryTypeConfiguration>
>>>>>>>>>>> {
>>>>>>>>>>>    new BinaryTypeConfiguration(typeof (Address)),
>>>>>>>>>>>    new BinaryTypeConfiguration(typeof (TestModel))
>>>>>>>>>>> }
>>>>>>>>>>> });
>>>>>>>>>>> ```
>>>>>>>>>>> 
>>>>>>>>>>> Note, we have a special public interface to map java type to .net
>>>>>>>> types -
>>>>>>>>>>> `IBinaryNameMapper`
>>>>>>>>>>> 
>>>>>>>>>>> ```
>>>>>>>>>>> public interface IBinaryNameMapper
>>>>>>>>>>> {
>>>>>>>>>>>    string GetTypeName(string name);
>>>>>>>>>>>    string GetFieldName(string name);
>>>>>>>>>>> }
>>>>>>>>>>> }
>>>>>>>>>>> ```
>>>>>>>>>>> 
>>>>>>>>>>> Users found this approach annoying and not convenient.
>>>>>>>>>>> So, recently we made a several improvements for the Service API
>> to
>>>>>>>>>>> implicitly register each custom type from service method
>> arguments.
>>>>>>>> [1],
>>>>>>>>>>> [2], [3]
>>>>>>>>>>> For now, user can just call Java service from .Net without any
>>>>>>>> additional
>>>>>>>>>>> configuration in case FQN NameMapper used.
>>>>>>>>>>> 
>>>>>>>>>>> I propose to extends approach with the implicit binary type
>>>>>>>> registration
>>>>>>>>>>> to all APIs and prepare PR for it [4].
>>>>>>>>>>> 
>>>>>>>>>>> What do you think?
>>>>>>>>>>> 
>>>>>>>>>>> [1]
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> https://github.com/apache/ignite/commit/35f551c023a12b3570d65c803d10c89480f7d5e4
>>>>>>>>>>> [2]
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> https://github.com/apache/ignite/commit/6d02e32e7f049e4f78f7abd37f4ff91d77f738c2
>>>>>>>>>>> [3]
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> https://github.com/apache/ignite/commit/c2204cda29e70294cc93756eabc844b64e07a42e
>>>>>>>>>>> [4] https://github.com/apache/ignite/pull/8635
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>> 
>> 

Reply via email to