Class 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 default Future 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.
    • 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)
        Support Futures.transform(com.google.common.util.concurrent.ListenableFuture<I>, com.google.common.base.Function<? super I, ? extends O>, java.util.concurrent.Executor) natively See AbstractFuture.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)
        Support Futures.transformAsync(ListenableFuture, AsyncFunction, Executor) natively See AbstractFuture.addListener(GenericFutureListener) for ordering semantics.
      • await

        public AsyncFuture<V> await()
                             throws java.lang.InterruptedException
        Wait for this future to complete Awaitable.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