Class AsyncFuture<V>
- java.lang.Object
-
- org.apache.cassandra.utils.concurrent.AbstractFuture<V>
-
- org.apache.cassandra.utils.concurrent.AsyncFuture<V>
-
- All Implemented Interfaces:
com.google.common.util.concurrent.ListenableFuture<V>
,io.netty.util.concurrent.Future<V>
,java.util.concurrent.Future<V>
,Awaitable
,Future<V>
- Direct Known Subclasses:
AsyncPromise
,BlockingPartitionRepair
,FutureCombiner
,FutureTask
,ImmediateFuture
,PaxosCleanup
,PaxosCleanupComplete
,PaxosCleanupLocalCoordinator
,PaxosCleanupSession
,PaxosFinishPrepareCleanup
,PaxosStartPrepareCleanup
,RepairJob
,RepairSession
,Scheduler.Task
,SnapshotTask
,StreamResultFuture
,SyncTask
,ValidationTask
public class AsyncFuture<V> extends AbstractFuture<V>
Our defaultFuture
implementation, with all state being managed without locks (except those used by the JVM). Some implementation comments versus Netty's default promise: - We permit efficient initial state declaration, avoiding unnecessary CAS or lock acquisitions when mutating a Promise we are ourselves constructing (and can easily add more; only those we use have been added) - We guarantee the order of invocation of listeners (and callbacks etc, and with respect to each other) - We save some space when registering listeners, especially if there is only one listener, as we perform no extra allocations in this case. - We implement our invocation list as a concurrent stack, that is cleared on notification - We handle special values slightly differently. - We do not use a special value for null, instead using a special value to indicate the result has not been set. This means that once isSuccess() holds, the result must be a correctly typed object (modulo generics pitfalls). - All special values are also instances of FailureHolder, which simplifies a number of the logical conditions.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.cassandra.utils.concurrent.Awaitable
Awaitable.AbstractAwaitable, Awaitable.AsyncAwaitable, Awaitable.Defaults, Awaitable.SyncAwaitable
-
-
Field Summary
-
Fields inherited from class org.apache.cassandra.utils.concurrent.AbstractFuture
CANCELLED, UNCANCELLABLE, UNSET
-
-
Constructor Summary
Constructors Modifier Constructor Description AsyncFuture()
protected
AsyncFuture(io.netty.util.concurrent.GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
protected
AsyncFuture(java.lang.Throwable immediateFailure)
protected
AsyncFuture(org.apache.cassandra.utils.concurrent.AbstractFuture.FailureHolder initialState)
protected
AsyncFuture(org.apache.cassandra.utils.concurrent.AbstractFuture.FailureHolder initialState, io.netty.util.concurrent.GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
protected
AsyncFuture(V immediateSuccess)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description AsyncFuture<V>
await()
Wait for this future to completeAwaitable.await()
boolean
awaitUntil(long nanoTimeDeadline)
Await until the deadline (in nanoTime), throwing any interrupt.<T> Future<T>
flatMap(java.util.function.Function<? super V,? extends Future<T>> flatMapper, java.util.concurrent.Executor executor)
SupportFutures.transformAsync(ListenableFuture, AsyncFunction, Executor)
natively SeeAbstractFuture.addListener(GenericFutureListener)
for ordering semantics.<T> Future<T>
map(java.util.function.Function<? super V,? extends T> mapper, java.util.concurrent.Executor executor)
SupportFutures.transform(com.google.common.util.concurrent.ListenableFuture<I>, com.google.common.base.Function<? super I, ? extends O>, java.util.concurrent.Executor)
natively SeeAbstractFuture.addListener(GenericFutureListener)
for ordering semantics.-
Methods inherited from class org.apache.cassandra.utils.concurrent.AbstractFuture
addCallback, addCallback, addCallback, addCallback, addCallback, addCallback, addListener, addListener, addListener, addListeners, await, awaitThrowUncheckedOnInterrupt, awaitThrowUncheckedOnInterrupt, awaitUninterruptibly, awaitUninterruptibly, awaitUntilThrowUncheckedOnInterrupt, awaitUntilUninterruptibly, cancel, cause, description, flatMap, get, get, getNow, getWhenDone, isCancellable, isCancelled, isDone, isSuccess, isUncancellable, map, map, notifyExecutor, removeListener, removeListeners, setUncancellable, setUncancellableExclusive, toString, tryFailure, trySuccess
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.cassandra.utils.concurrent.Future
await, awaitUninterruptibly, flatMap, rethrowIfFailed, sync, syncThrowUncheckedOnInterrupt, syncUninterruptibly
-
-
-
-
Constructor Detail
-
AsyncFuture
public AsyncFuture()
-
AsyncFuture
protected AsyncFuture(V immediateSuccess)
-
AsyncFuture
protected AsyncFuture(java.lang.Throwable immediateFailure)
-
AsyncFuture
protected AsyncFuture(org.apache.cassandra.utils.concurrent.AbstractFuture.FailureHolder initialState)
-
AsyncFuture
protected AsyncFuture(io.netty.util.concurrent.GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
-
AsyncFuture
protected AsyncFuture(org.apache.cassandra.utils.concurrent.AbstractFuture.FailureHolder initialState, io.netty.util.concurrent.GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
-
-
Method Detail
-
map
public <T> Future<T> map(java.util.function.Function<? super V,? extends T> mapper, java.util.concurrent.Executor executor)
SupportFutures.transform(com.google.common.util.concurrent.ListenableFuture<I>, com.google.common.base.Function<? super I, ? extends O>, java.util.concurrent.Executor)
natively SeeAbstractFuture.addListener(GenericFutureListener)
for ordering semantics.
-
flatMap
public <T> Future<T> flatMap(java.util.function.Function<? super V,? extends Future<T>> flatMapper, @Nullable java.util.concurrent.Executor executor)
SupportFutures.transformAsync(ListenableFuture, AsyncFunction, Executor)
natively SeeAbstractFuture.addListener(GenericFutureListener)
for ordering semantics.
-
await
public AsyncFuture<V> await() throws java.lang.InterruptedException
Wait for this future to completeAwaitable.await()
- Throws:
java.lang.InterruptedException
- if interrupted
-
awaitUntil
public boolean awaitUntil(long nanoTimeDeadline) throws java.lang.InterruptedException
Description copied from interface:Awaitable
Await until the deadline (in nanoTime), throwing any interrupt. No spurious wakeups.- Returns:
- true if we were signalled, false if the deadline elapsed
- Throws:
java.lang.InterruptedException
- if interrupted
-
-