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