Hi folks, I did not quite get what user problem we are trying to solve so far.
The simplest thing which comes to my mind is to prohibit MVCC caches creation in a data region with eviction configured. What am I missing? Why do we need this feature today? чт, 13 дек. 2018 г. в 22:33, Vladimir Ozerov <voze...@gridgain.com>: > > It's hard to believe that entries are not locked on backups, because we > wrtite data right away. Even if it so, it should be very easy to fix - just > do not evict and entry if it was created or deleted by currently active > transaction. > > On Thu, Dec 13, 2018 at 10:28 PM Roman Kondakov <kondako...@mail.ru.invalid> > wrote: > > > Vladimir, > > > > we do not lock entries on backups when MVCC is enabled and therefore we > > don't avoid entry eviction from backup by locking. So, your first > > scenario with primary stop is still relevant. > > > > > > -- > > Kind Regards > > Roman Kondakov > > > > On 13.12.2018 22:14, Vladimir Ozerov wrote: > > > No, I mean that we should think about what kind of guarantees it > > possible. > > > My proposal was to prevent evictions of locked entries. This way we can > > say > > > users: "if you want true REPEATABLE_READ when evictions are enabled, then > > > make sure to lock entries on every access". This effectively means that > > all > > > SELECT's should be replaced with "SELECT FOR UPDATE". > > > > > > On Thu, Dec 13, 2018 at 10:09 PM Roman Kondakov > > <kondako...@mail.ru.invalid> > > > wrote: > > > > > >> Vladimir, > > >> > > >> correct me please if i misunderstood your thought. So, if eviction is > > >> not about a consistency at all, we may evict keys in any way because > > >> broken repeatable read semantics is not the biggest problem here. But we > > >> should add some notes about it to user documentation. Right? > > >> > > >> > > >> -- > > >> Kind Regards > > >> Roman Kondakov > > >> > > >> On 13.12.2018 17:45, Vladimir Ozerov wrote: > > >>> Roman, > > >>> > > >>> I would start with the fact that eviction can never be consistent > > unless > > >> it > > >>> utilizes atomic broadcast protocol, which is not the case for Ignite. > > In > > >>> Ignite entries on node are evicted independently. > > >>> > > >>> So you may easily get into situation like this: > > >>> 1) Start a cache with 1 backup and FULL_SYNC mode > > >>> 2) Put a key to primary node > > >>> 3) Stop primary > > >>> 4) Try reading from new primary and get null because key was evicted > > >>> concurrently > > >>> > > >>> Or: > > >>> 1) Start a transaction in PESSIMISTIC/READ_COMMITTED mode > > >>> 2) Read a key, get value > > >>> 3) Read the same key again, get null > > >>> > > >>> So in reality the choice is not between consistent and inconsistent > > >>> behavior, but rather about degree of inconsistency. Any solution is > > >>> possible as long as we can explain it to the user. E.g. "do not evict a > > >> key > > >>> if it is either write-locked". > > >>> > > >>> > > >>> On Thu, Dec 13, 2018 at 5:19 PM Vladimir Ozerov <voze...@gridgain.com> > > >>> wrote: > > >>> > > >>>> Andrey, > > >>>> > > >>>> We will not be able to cache the whole data set locally, as it > > >> potentially > > >>>> lead to OOME. We will have this only as an option and only for non-SQL > > >>>> updates. Thus, similar semantics is not possible. > > >>>> > > >>>> On Thu, Dec 13, 2018 at 4:56 PM Andrey Mashenkov < > > >>>> andrey.mashen...@gmail.com> wrote: > > >>>> > > >>>>> Roman, > > >>>>> > > >>>>> We have a ticket to improve repeatable_read mode [1] via caching > > >> entries > > >>>>> locally. > > >>>>> This should make mvcc transaction repeatable_read semantic similar to > > >>>>> non-mvcc Txs > > >>>>> and allow us to implement eviction in correct way. > > >>>>> > > >>>>> Another way is to introduce mvcc shared (read) entry locks and evict > > >> only > > >>>>> entries if no one hold any lock on it, > > >>>>> but this looks tricky and error prone as your first one as it may > > lead > > >> to > > >>>>> eviction policy unexpected behavior, > > >>>>> e.g some versions can be visible while others - no (evicted). > > >>>>> > > >>>>> [1] https://issues.apache.org/jira/browse/IGNITE-7371 > > >>>>> > > >>>>> On Thu, Dec 13, 2018 at 4:34 PM Ilya Kasnacheev < > > >>>>> ilya.kasnach...@gmail.com> > > >>>>> wrote: > > >>>>> > > >>>>>> Hello! > > >>>>>> > > >>>>>> Is it possible to 'touch' entries read by MVCC transactions to > > ensure > > >>>>> that > > >>>>>> they are considered recent and therefore are almost never targeted > > by > > >>>>>> eviction? > > >>>>>> > > >>>>>> This is 1) with benefits. > > >>>>>> > > >>>>>> Regards, > > >>>>>> -- > > >>>>>> Ilya Kasnacheev > > >>>>>> > > >>>>>> > > >>>>>> чт, 13 дек. 2018 г. в 16:22, Roman Kondakov > > >> <kondako...@mail.ru.invalid > > >>>>>> : > > >>>>>> > > >>>>>>> Hi igniters, > > >>>>>>> > > >>>>>>> I need your advice with the following issue. When in-memory cache > > >>>>>>> reaches it's memory limit, some data may be purged to avoid OOM > > >> error. > > >>>>>>> This process is described in [1]. For MVCC caches this eviction may > > >>>>>>> break repeatable read semantics. For example, if transaction reads > > >> key > > >>>>>>> before eviction, this key is visible for it. But if key is evicted > > >>>>> some > > >>>>>>> time later, this key become invisible to anyone, including our > > >>>>>>> transaction, which means broken repeatable read semantics. > > >>>>>>> > > >>>>>>> Now we see the following solutions of this problem: > > >>>>>>> > > >>>>>>> 1. Ignore broken repeatable read semantics. If cache is set to > > allow > > >>>>>>> data eviction, it may lose it's data. This means that there is no > > >>>>>>> valuable information stored in cache and occasional repeatable read > > >>>>>>> violations can be tolerated. > > >>>>>>> > > >>>>>>> 2. Prohibit eviction of MVCC caches at all. For example, stop > > writing > > >>>>> to > > >>>>>>> caches and throw an appropriate exception in the case when there is > > >> no > > >>>>>>> free space in page memory. Before this exception Ignite should do > > >> it's > > >>>>>>> best to avoid this situation, for example, evict all non-mvcc > > caches > > >>>>> and > > >>>>>>> run full vacuum to free as much space as possible. > > >>>>>>> > > >>>>>>> First approach is bad because it leads to cache consistency > > >> violation. > > >>>>>>> Second approach is bad because it's behavior may be unexpected to > > >> user > > >>>>>>> if he has set an eviction policy for cache, but instead of eviction > > >>>>>>> Ignite trying to avoid it as much as possible. > > >>>>>>> > > >>>>>>> IMO first approach looks better - it is much simpler to implement > > and > > >>>>>>> met user expectations in all points except possible repeatable read > > >>>>>>> violations. > > >>>>>>> > > >>>>>>> What do you think? > > >>>>>>> > > >>>>>>> > > >>>>>>> [1] https://apacheignite.readme.io/docs/evictions > > >>>>>>> > > >>>>>>> -- > > >>>>>>> Kind Regards > > >>>>>>> Roman Kondakov > > >>>>>>> > > >>>>>>> > > >>>>> -- > > >>>>> Best regards, > > >>>>> Andrey V. Mashenkov > > >>>>> > > -- Best regards, Ivan Pavlukhin