Roman,

Thank you for pointing out usage as an in-memory cache. I will try to
describe how do I see the use case.

First of all our MVCC caches provides transactions. And a user will
choose MVCC if his workflow is transactional. If a use case is a
caching layer then some backing storage is assumed. But we have not
yet well integrated support for 3rd party persistence [1]. And I think
that it is better to cover whole track in complex.

Of course there might be another valid use cases which I am not aware
of. Please point me out if you have one in mind.

[1] https://apacheignite.readme.io/docs/3rd-party-store

2018-12-14 18:40 GMT+03:00, Seliverstov Igor <gvvinbl...@gmail.com>:
> Roman,
>
> I would prefer first option.
>
> The fact user uses MVCC says he needs some more strict guaranties which
> cannot meet in other modes.
> I would rollback both txs in case we cannot provide such guaranties.
>
> Regards,
> Igor
>
> пт, 14 дек. 2018 г. в 15:36, Roman Kondakov <kondako...@mail.ru.invalid>:
>
>> Vladimir,
>>
>> I was thinking about your proposal to not evict locked and recent (the
>> transaction that created the record is still active) entries from the
>> cache. Let's imagine next situation: we have almost full memory and two
>> transactions:
>>
>> 1. txA: "SELECT * FOR UPDATE"
>>
>> 2. txB: "INSERT ...many keys here..."
>>
>> In this case txA locks all entries in the cache, and therefore we cannot
>> evict any of them. If then txB is trying to add a lot of data, it lead
>> us to the OOM situation, which user is trying to avoid using cache
>> evictions.
>>
>> I see two ways how to deal with this issue:
>>
>> 1. Allow OOM in MVCC caches with configured evictions and warn user
>> about it in the docs.
>>
>> 2. Give up with the repeatable read guaranties in case of evictions for
>> MVCC caches and warn users about it in the documentation.
>>
>> Second variant looks better for me because user may not expect OOM when
>> he has configured eviction policy for cache.
>>
>> What do you think?
>>
>>
>> --
>> Kind Regards
>> Roman Kondakov
>>
>> On 13.12.2018 22:33, Vladimir Ozerov wrote:
>> > 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

Reply via email to