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