Pavel,

I might be missing something - could you please elaborate a little more?

When I say "sync on top of async", I basically mean that (for example)
'insert(..)' is equivalent to 'insertAsync(..).join()'. In my
understanding, it only blocks the user's thread.

Am I wrong? Or you have a different implementation in mind?

-Val

On Wed, Sep 8, 2021 at 12:50 AM Pavel Tupitsyn <ptupit...@apache.org> wrote:

> Val,
>
> Agree with your points.
>
>
> > async API should be primary
>
> It should be noted that all our APIs are inherently async,
> because thin client is implemented asynchronously.
>
>
> > with the sync version build on top
>
> We should document somehow that sync APIs are based on async ones,
> because this may be dangerous in some use cases.
>
> For example, as a user, I may have a thread pool of 4 threads for
> Ignite-related usage, that is also set as asyncContinuationExecutor [1].
> Now if I run a lot of concurrent Ignite requests using sync API, all 4
> threads will end up blocked on CompletableFutures.
> When one of the operations completes, we enqueue the completion to that
> same thread pool, but all threads are blocked on sync APIs, resulting in a
> deadlock.
>
> This can be prevented by using a different asyncContinuationExecutor, but
> sync API users won't be usually aware of this.
>
>
> [1] https://issues.apache.org/jira/browse/IGNITE-15359
>
> On Wed, Sep 8, 2021 at 10:04 AM Courtney Robinson <
> courtney.robin...@hypi.io>
> wrote:
>
> > Hi Val,
> >
> > I'd highly support an async first API based on CompletionStage
> > <
> >
> https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html
> > >
> > or
> > its subtypes like CompletableFuture.
> > In Ignite 2 we've written a wrapper library around IgniteFuture to
> provide
> > CompletionStage instead because many of the newer libs we use support
> this.
> > If Ignite 3 went this way it'd remove a lot of boiler plate/wrapper that
> we
> > wrote to get what you're suggesting here.
> >
> > Regards,
> > Courtney Robinson
> > Founder and CEO, Hypi
> > Tel: ++44 208 123 2413 (GMT+0) <https://hypi.io>
> >
> > <https://hypi.io>
> > https://hypi.io
> >
> >
> > On Wed, Sep 8, 2021 at 12:44 AM Valentin Kulichenko <
> > valentin.kuliche...@gmail.com> wrote:
> >
> > > Igniters,
> > >
> > > I would like to gather some opinions on whether we want to focus on
> sync
> > vs
> > > async APIs in Ignite 3.
> > >
> > > Here are some initial considerations that I have:
> > > 1. Ignite 2.x is essentially "sync first". Async APIs exist, but they
> use
> > > non-standard IgniteFuture and provide counterintuitive guarantees. In
> my
> > > experience, they significantly lack usability, and because of that are
> > > rarely used.
> > > 2. In general, however, async execution becomes more and more
> prominent.
> > > Something we can't ignore if we want to create a modern framework.
> > > 3. Still, async support in Java is very limited (especially if compared
> > to
> > > other languages, like C# for example).
> > >
> > > My current position is the following (happy to discuss):
> > > 1. We should pay more attention to async APIs. As a general rule, async
> > API
> > > should be primary, with the sync version build on top.
> > > 2. In languages with proper async support (async-await, etc.), we can
> > skip
> > > sync API altogether. As an example of this, you can look at the first
> > > version of the .NET client [1]. It exposes only async methods, and it
> > > doesn't look like sync counterparts are really needed.
> > > 3. In Java (as well as other languages where applicable), we will add
> > sync
> > > APIs that simply delegate to async APIs. This will help users to avoid
> > > CompletableFuture if they don't want to use it.
> > >
> > > [1] https://github.com/apache/ignite-3/pull/306
> > >
> > > Please share your thoughts.
> > >
> > > -Val
> > >
> >
>

Reply via email to