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