Hello.

> If we want to make metastore more reliable we should provide some command to 
> remove keys from it.

Ticket [1] to provide this feature created.

[1] https://issues.apache.org/jira/browse/IGNITE-13901

> 22 дек. 2020 г., в 17:57, Nikolay Izhikov <nizhikov....@gmail.com> написал(а):
> 
> Hello, Anton.
> 
> Thanks for the answer!
> 
>> Only maybe, it makes sense to remove such records (with all history) instead 
>> of filtering them.
> 
> I don’t think we should do this, by default.
> 
> Imagine scenario #1: 
> 
> 1. Update the plugin to the next bugged version. Some class that is written 
> to the metastore is lost.
> 2. Remove the key from the metastore to fix current deployment.
> 3. Deploy updated plugin 
> 
> We will lose plugin information from metastore on step #3.
> 
> If we want to make metastore more reliable we should provide some command to 
> remove keys from it.
> This will fix scenario #2 when we migrate from one Ignite deployment to 
> another and some keys become unused.
> 
>> 22 дек. 2020 г., в 17:39, Anton Kalashnikov <kaa....@yandex.ru> написал(а):
>> 
>>> How it differs from the current implementation?
>> There are no differences in implementation. But according to the original 
>> topic, plugins or other external things can write to metastore their own 
>> classes. I just said that according to current architecture it is not a good 
>> idea to do that because these POJO's are not from the core.
>> 
>>> Why do you think that «good» solution should exist for this kind of issue?
>> I don't think so. I just emphasize my concern about local filtering(the 
>> usage of system property) in this solution because it can lead to different 
>> behavior on different nodes. But perhaps you are right, and for such bug we 
>> can use a such solution.
>> 
>>> Maybe we should make metastore fully lazy, so any stored key will not be 
>>> deserialized before it explicitly queried.
>> I approximately meant the same. We should think about that.
>> 
>> In conclusion(my opinions):
>> 
>> In the current design, inside of plugins(etc.) it makes sense to use only 
>> primitives or POJO's from the core. (This is my answer to the original topic)
>> It makes sense to think about serialization by demand inside of metastorage 
>> rather than in the discovery.
>> I have no good solution for resolving the bug with removed classes. Perhaps, 
>> we can use Nikolay's fix. Only maybe, it makes sense to remove such records 
>> (with all history) instead of filtering them.
>> 
>> -- 
>> Best regards,
>> Anton Kalashnikov
>> 
>> 
>> 
>> 22.12.2020, 14:44, "Nikolay Izhikov" <nizhi...@apache.org>:
>>> 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