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