Andrey,

I see. So in a nutshell, you're saying that we want to return a future that
the user's code is not allowed to complete. In this case, I think it's
clear that CompletableFuture is not what we need. We actually need a
NonCompletableFuture :)

My vote is for the custom interface.

-Val

On Fri, Mar 26, 2021 at 2:25 AM Andrey Mashenkov <andrey.mashen...@gmail.com>
wrote:

> Val,
>
> The methods below shouldn't be accessible for user:
> complete()
> completeExceptionaly()
>
> Returning CompletableFuture we must always make a copy to prevent the
> original future from being completed by mistake.
> I think it will NOT be enough to do that returing the future to the
> end-user, but from every critical module to the outside of the module,
> e.g. to plugins. The impact of disclosing ExchangeFuture,
> PartitionReleaseFuture to plugins may be serious.
>
> IgniteFuture<T> extends Future<T>, CompletionStage<T> which implementation
> will just wrap CompletableFuture these issues will be resolved in natural
> way.
> In addition we can force toCompletableFuture() method to return a defensive
> copy(), that resolves the last concern.
>
>
> On Fri, Mar 26, 2021 at 11:38 AM Konstantin Orlov <kor...@gridgain.com>
> wrote:
>
> > CompletableFuture seems a better option to me.
> >
> > --
> > Regards,
> > Konstantin Orlov
> >
> >
> >
> >
> > > On 26 Mar 2021, at 11:07, Pavel Tupitsyn <ptupit...@apache.org> wrote:
> > >
> > > On the one hand, I agree with Alexey.
> > > CompletableFuture has complete* methods which should not be available
> to
> > > the user code.
> > > This can be solved with a simple interface like we do in Thin Client:
> > > IgniteClientFuture<T> extends Future<T>, CompletionStage<T>
> > >
> > >
> > > On the other hand:
> > > - CompletionStage has toCompletableFuture anyway (rather weird)
> > > - Other libraries use CompletableFuture and it seems to be fine
> > > - Using CompletableFuture is the simplest approach
> > >
> > >
> > > So I lean towards CompletableFuture too.
> > >
> > > On Fri, Mar 26, 2021 at 10:46 AM Alexey Kukushkin <
> > kukushkinale...@gmail.com>
> > > wrote:
> > >
> > >> I do not like Java's CompletableFuture and prefer our own Future
> > (revised
> > >> IgniteFuture).
> > >>
> > >> My understanding of the Future (or Promise) pattern in general is
> having
> > >> two separate APIs:
> > >>
> > >>   1. Server-side: create, set result, raise error, cancel from server.
> > >>   2. Client-side: get result, handle error, cancel from client
> > >>
> > >> Java's CompletableFuture looks like both the client-side and
> > >> server-side API. The "Completeable" prefix in the name is already
> > confusing
> > >> for a client since it cannot "complete" an operation, only a server
> can.
> > >>
> > >> I would create our own IgniteFuture adding client-side functionality
> we
> > >> currently miss (like client-side cancellation).
> > >>
> > >>
> > >> пт, 26 мар. 2021 г. в 01:08, Valentin Kulichenko <
> > >> valentin.kuliche...@gmail.com>:
> > >>
> > >>> Andrey,
> > >>>
> > >>> Can you compile a full list of these risky methods, and elaborate on
> > what
> > >>> the risks are?
> > >>>
> > >>> Generally, CompletableFuture is a much better option, because it's
> > >>> standard. But we need to make sure it actually fits our needs and
> > doesn't
> > >>> do more harm than good.
> > >>>
> > >>> -Val
> > >>>
> > >>> On Thu, Mar 25, 2021 at 12:23 PM Alexei Scherbakov <
> > >>> alexey.scherbak...@gmail.com> wrote:
> > >>>
> > >>>> I think both options are fine, but personally lean toward
> > >>>> CompletableFuture.
> > >>>>
> > >>>> чт, 25 мар. 2021 г. в 17:56, Atri Sharma <a...@apache.org>:
> > >>>>
> > >>>>> I would suggest using CompletableFuture -- I don't see a need for a
> > >>>> custom
> > >>>>> interface that is unique to us.
> > >>>>>
> > >>>>> It also allows a lower barrier for new contributors for
> understanding
> > >>>>> existing code
> > >>>>>
> > >>>>> On Thu, 25 Mar 2021, 20:18 Andrey Mashenkov, <
> > >>> andrey.mashen...@gmail.com
> > >>>>>
> > >>>>> wrote:
> > >>>>>
> > >>>>>> Hi Igniters,
> > >>>>>>
> > >>>>>> I'd like to start a discussion about replacing our custom
> > >>> IgniteFuture
> > >>>>>> class with CompletableFuture - existed JDK class
> > >>>>>> or rework it's implementation (like some other products done) to a
> > >>>>>> composition of CompletionStage and Future interfaces.
> > >>>>>> or maybe other option if you have any ideas. Do you?
> > >>>>>>
> > >>>>>> 1. The first approach pros and cons are
> > >>>>>> + Well-known JDK class
> > >>>>>> + Already implemented
> > >>>>>> - It is a class, not an interface.
> > >>>>>> - Expose some potentially harmful methods like "complete()".
> > >>>>>>
> > >>>>>> On the other side, it has copy() method to create defensive copy
> > >> and
> > >>>>>> minimalCompletionStage() to restrict harmful method usage.
> > >>>>>> Thus, this look like an applicable solution, but we should be
> > >> careful
> > >>>>>> exposing internal future to the outside.
> > >>>>>>
> > >>>>>> 2. The second approach is to implement our own interface like the
> > >>> next
> > >>>>> one:
> > >>>>>>
> > >>>>>> interface IgniteFuture<T> extends CompletableStage<T>, Future<T> {
> > >>>>>> }
> > >>>>>>
> > >>>>>> Pros and cons are
> > >>>>>> + Our interfaces/classes contracts will expose an interface rather
> > >>> than
> > >>>>>> concrete implementation.
> > >>>>>> + All methods are safe.
> > >>>>>> - Some implementation is required.
> > >>>>>> - CompletableStage has a method toCompletableFuture() and can be
> > >>>>> converted
> > >>>>>> to CompletableFuture. This should be supported.
> > >>>>>>
> > >>>>>> However, we still could wrap CompletableFuture and don't bother
> > >> about
> > >>>>>> creating a defensive copy.
> > >>>>>>
> > >>>>>>
> > >>>>>> Other project experience:
> > >>>>>> * Spotify uses CompletableFuture directly [1].
> > >>>>>> * Redis goes the second approach [2]
> > >>>>>> * Vertx explicitly extends CompletableFuture [3]. However, they
> > >> have
> > >>>>> custom
> > >>>>>> future classes and a number of helpers that could be replaced with
> > >>>>>> CompletableStage. Maybe it is just a legacy.'
> > >>>>>>
> > >>>>>> Any thoughts?
> > >>>>>>
> > >>>>>> [1]
> > >>>>>>
> > >>>>>>
> > >>>>>
> > >>>>
> > >>>
> > >>
> >
> https://spotify.github.io/completable-futures/apidocs/com/spotify/futures/ConcurrencyReducer.html
> > >>>>>> [2]
> > >>>>>>
> > >>>>>>
> > >>>>>
> > >>>>
> > >>>
> > >>
> >
> https://lettuce.io/lettuce-4/release/api/com/lambdaworks/redis/RedisFuture.html
> > >>>>>> [3]
> > >>>>>>
> > >>>>>>
> > >>>>>
> > >>>>
> > >>>
> > >>
> >
> https://javadoc.io/static/org.jspare.vertx/vertx-jspare/1.1.0-M03/org/jspare/vertx/concurrent/VertxCompletableFuture.html
> > >>>>>> --
> > >>>>>> Best regards,
> > >>>>>> Andrey V. Mashenkov
> > >>>>>>
> > >>>>>
> > >>>>
> > >>>>
> > >>>> --
> > >>>>
> > >>>> Best regards,
> > >>>> Alexei Scherbakov
> > >>>>
> > >>>
> > >>
> > >>
> > >> --
> > >> Best regards,
> > >> Alexey
> > >>
> >
> >
>
> --
> Best regards,
> Andrey V. Mashenkov
>

Reply via email to