Hello, Anton.

> or use the POJO from the ignite core.

How it differs from the current implementation?

> As I can see you have tests only for one node but what happens if different 
> nodes have different filters? 

The error will happen.

Please, don’t forget that we are talking about two scenarios:

1. Blocker bug - we delete some class that was written to metastore from the 
new version.
2. Migration between custom Ignite distributions where one of them has a custom 
class and the other doesn’t.

It’s a very rare incident in my experience.

Why do you think that «good» solution should exist for this kind of issue?
I don’t think we should limit internal architecture to cover these cases.

Maybe we should make metastore fully lazy, so any stored key will not be 
deserialized before it explicitly queried.



> 22 дек. 2020 г., в 14:30, Anton Kalashnikov <kaa....@yandex.ru> написал(а):
> 
> Hello everyone,
> 
> In my opinion, it is indeed better to limit storing to the metastore by 
> primitive type(map or list are also possible) or use the POJO from the ignite 
> core.
> As Kirill correctly notice, right now, it is a problem not inside of the 
> distributed metastore but inside of discovery. 
> In fact, we can rewrite the sending metastore data  in such a way that the 
> discovery would think that there is just a simple byte array which shouldn't 
> be deserialized. Right now, it understands that it is a serialized java 
> object and it tries to deserialize it after receiving it. But this way 
> requires more investigation about possible corner cases.
> 
> Nikolay,  I also don't sure that your fix handles metastorage history 
> correctly. 
> As I can see you have tests only for one node but what happens if different 
> nodes have different filters? 
> or if we need to send history to the joining node but some of the keys don't 
> pass the filter? 
> Maybe I wrong but in the first eye, it can lead to different 
> results/histories on different nodes which is a problem.
> I just briefly looked at your PR(so maybe I didn't understand something), I 
> will try to do it more carefully at the nearest time. 
> 
> -- 
> Best regards,
> Anton Kalashnikov
> 
> 
> 
> 18.12.2020, 15:33, "Mekhanikov Denis" <dmekhani...@gmail.com>:
>> Nikolay,
>> 
>> Thanks for your reply!
>> 
>> I encountered a similar case to what you've described in point #1. I used a 
>> private plugin that writes some information to the metastorage.
>> After that I decided to get rid of that plugin, while the information had 
>> already been written to the metastorage.
>> Following the approach that you described and implemented in the PR, I'll 
>> need to work with the flag to ignore certain keys in the metastorage 
>> forever. That's quite inconvenient.
>> Wouldn't it be better if we just limited the set of allowed types that can 
>> be stored in the metastorage? Instead of a POJO, a Map will be accepted.
>> 
>> Denis
>> 
>> On 18.12.2020, 13:59, "ткаленко кирилл" <tkalkir...@yandex.ru> wrote:
>> 
>>     Hello everybody!
>> 
>>     If you look at the stackTrace, the error is that deserialized objects 
>> are being sent to listeners.
>>     It may be more correct to send a raw arrays of bytes, and each plugin 
>> will be able to process it if needed.
>> 
>>     18.12.2020, 12:18, "Nikolay Izhikov" <nizhi...@apache.org>:
>>     > Hello, Denis.
>>     >
>>     > It’s a known issue for me.
>>     > Metastore is a private API, isn’t it?
>>     > AFAICU it can occur for two reasons:
>>     >
>>     > * User migrates from custom Ignite fork that has private improvements 
>> or plugins that write to the metastore.
>>     > * We have a blocker bug and just remove some internal class that can 
>> be written into metastore from distribution.
>>     >
>>     > I planned to fix it with some system flag.
>>     > During startup administrator just sets a list of the metastore items 
>> that should be ignored.
>>     > Please, take a look at the PR [1]
>>     >
>>     > WDYT?
>>     >
>>     >> it’s better to limit the metastorage with storing primitives only
>>     >
>>     > I think that ability to write object is very useful and should stay.
>>     >
>>     > [1] https://github.com/apache/ignite/pull/8221
>>     >
>>     >> 18 дек. 2020 г., в 12:06, Mekhanikov Denis <dmekhani...@gmail.com> 
>> написал(а):
>>     >>
>>     >> Hi everyone!
>>     >>
>>     >> Ignite has a limitation that it can’t work with custom classes put 
>> into metastorage: https://issues.apache.org/jira/browse/IGNITE-13642
>>     >> If you put a POJO into the metastorage, then Ignite will try to 
>> deserialize it using the classes it finds on the classpath. If it can’t do 
>> the deserialization, then the node will fail.
>>     >>
>>     >> There is an opinion that the metastorage wasn’t design for a case 
>> when classes that can disappear from Ignite distribution.
>>     >> If we follow this path, then it’s better to limit the metastorage 
>> with storing primitives only, so that it’s impossible to occasionally put 
>> anything breaking.
>>     >> If a piece of configuration is put into the metastorage by a plugin, 
>> then the plugin will be in charge of deserializing the configuration, and 
>> not Ignite.
>>     >>
>>     >> Alternatively we can try to fix the metastorage and make it ignore 
>> deserialization errors when they occur.
>>     >>
>>     >> What do you think?
>>     >>
>>     >> Denis

Reply via email to