I created a ticket from this discussion: https://issues.apache.org/jira/browse/IGNITE-2399
Can someone please review it (and edit if needed)? Best regrads, VJ On Mon, Jan 18, 2016 at 12:28 PM, Yakov Zhdanov <yzhda...@apache.org> wrote: > I like the idea. Couple of comments though. > > I would leave only <T> IgniteFuture<T> acquireAndExecute(Callable<T> > action); Overload with executor can be omitted because callable > implementation can use any executor. As far as moving acquire logic to > another thread pool - I think we'd better go without it same as for any > other Ignite operations. Andrey, what was the pool intended for? > > This T> IgniteFuture<T> > acquireAndExecuteAsyncAction(Callable<IgniteFuture<T>> > action); can be implemented with <T> IgniteFuture<T> > acquireAndExecute(Callable<T> action); where T is IgniteFuture for > operations initiated and returned by callable. Makes sense? > > > --Yakov > > 2016-01-18 0:39 GMT+03:00 Andrey Kornev <andrewkor...@hotmail.com>: > > > Just to clarify, 7.4 below refers to GridGain 7.4, which is Ignite 1.4. > > _____________________________ > > From: Andrey Kornev <andrewkor...@hotmail.com> > > Sent: Sunday, January 17, 2016 10:27 AM > > Subject: RE: Semaphore action > > To: <dev@ignite.apache.org> > > > > > > Vladisav, > > > > It would be great if you could implement the enhancements! > > > > And while we're at it, here's something else I'd like us to consider. > The > > proposed API only gets us half way there: there is no longer a blocking > > wait for the permit, but the action must be blocking. I really think it > > should be possible to do the whole thing asynchronously including the > > action and release of the permit. (In fact, this is what I need for my > > project. In 7.4, I was able to implement this feature using just the > public > > APIs, but I'd really like to drop that code and start using the Semaphore > > API.) > > > > For example, upon the permit acquisition, the action could fire off a > > distributed compute and rather than block waiting for the results to come > > back, it would simply return the future provided by Ignite's withAsync(). > > The semaphore implementation would not release the permit immediately > upon > > the action return. Instead, it'd do so only when the action future > > completes. > > > > Here's how the API might look like: > > > > <T> IgniteFuture<T> > > acquireAndExecuteAsyncAction(Callable<IgniteFuture<T>> action); > > > > This API makes it possible to execute a protected action with no > blocking > > whatsoever! It's a lot more efficient, reduces the pressure on Ignite's > > thread pools and prevents thread starvation, and so on. > > > > Regards > > Andrey > > > > > Date: Sun, 17 Jan 2016 10:40:53 +0100 > > > Subject: Re: Semaphore action > > > From: vladis...@gmail.com > > > To: dev@ignite.apache.org > > > > > > It does sounds like a useful addition, > > > and I believe it could be implemented easily. > > > I can do it if the community agrees on changing the API of the > > Semaphore. > > > > > > Best regards, > > > VJ > > > > > > On Sun, Jan 17, 2016 at 5:53 AM, Andrey Kornev < > > andrewkor...@hotmail.com> > > > wrote: > > > > > > > Dmitriy,I don't believe it makes sense to have the action execute > > > > remotely. At least I didn't think of it.In my mind, the action is > > always > > > > local (that's the reason I suggested the Java's Callable in the API > > and not > > > > serializable IgniteCallable, in the first place). What the action > > does is > > > > entirely up to the user. One could fire off a remote compute if > > that's what > > > > one wants.I hope I make myself clear.ThanksAndrey > > > > _____________________________ > > > > From: Dmitriy Setrakyan <dsetrak...@apache.org> > > > > Sent: Saturday, January 16, 2016 7:54 AM > > > > Subject: Re: Semaphore action > > > > To: <dev@ignite.apache.org> > > > > > > > > > > > > Andrey, > > > > > > > > In general this seems like a good addition. However, I do not > > understand > > > > how you can specify an executor, given that execution could happen > > > > remotely. Can you please clarify? > > > > > > > > D. > > > > > > > > On Fri, Jan 15, 2016 at 1:00 PM, Andrey Kornev < > > andrewkor...@hotmail.com> > > > > wrote: > > > > > > > > > Hi there, > > > > > > > > > > The Semaphore feature was a great addition to Ignite's > > synchronization > > > > > primitive toolkit. I'd like to propose an enhancement to make > > Semaphore > > > > API > > > > > even more useful. > > > > > > > > > > My biggest complaint about the current API is its blocking > nature. > > For > > > > > example, the only way to acquire a permit is by using the > blocking > > > > > acquire() method (tryAcquire() is not very useful in the cases > > when you > > > > > MUST acquire before you can proceed). I believe that in the 21st > > century > > > > > blocking APIs is anachronism. :))) It's a bit embarrassing even. > > I'm > > > > sure > > > > > Ignite can do better than that! :) > > > > > > > > > > Usually a permit acquisition is followed by an action, followed > by > > a > > > > > release of the permit. I propose a simple enhancement to the > > Semaphore > > > > API > > > > > that will reduce the boilerplate and make it possible to do all > of > > that > > > > > asynchronously! The new method might look like this: > > > > > > > > > > <T> IgniteFuture<T> acquireAndExecute(Callable<T> action); > > > > > <T> IgniteFuture<T> acquireAndExecute(Callable<T> action, > Executor > > > > > executor); > > > > > > > > > > (The name could be improved, of course...) The first method would > > > > > immediately return a future to be later completed by the action's > > > > result. > > > > > The action will be executed on a thread from the Ignite's public > > thread > > > > > pool once a permit has been acquired. Optionally, the user could > > > > specify a > > > > > different executor using the second signature. > > > > > > > > > > Would the community be interested in such enhancement? > > > > > > > > > > Thanks > > > > > Andrey > > > > > > > > > > PS. A subject for a separate discussion, but I believe that in > the > > next > > > > > major release Ignite should just drop the clumsy withAsync() API > > and > > > > make > > > > > all blocking calls explicitly async by returning a future. In my > > > > opinion it > > > > > would greatly simplify the API and make it more modern. Besides, > > I'm > > > > pretty > > > > > sure that internally Ignite already creates futures for pretty > much > > > > most of > > > > > the API calls, so it should not cause any performance issue. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >