To put it another way:
- true sync operation completes by itself
- sync-over-async operation requires another thread to complete

On Wed, Sep 8, 2021 at 10:15 PM Pavel Tupitsyn <ptupit...@apache.org> wrote:

> Val,
>
> That's exactly what I have in mind.
> Yes, we block the user thread, but then we should unblock it by completing
> the future.
> We can't complete the future from a Netty thread [1], so we'll need some
> other thread from some executor.
> If there are no threads available (because they are blocked by the sync
> API above), the future won't complete => deadlock.
>
> [1]
> https://lists.apache.org/thread.html/r528659381d983a177d779f56ef3d7da6fe17eb3504383f5f87727514%40%3Cdev.ignite.apache.org%3E
>
> On Wed, Sep 8, 2021 at 9:40 PM Valentin Kulichenko <
> valentin.kuliche...@gmail.com> wrote:
>
>> 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