Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-4493

Future.get() never finish after getAsync() with FutureListener

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Minor Minor
    • 7.0.0.Alpha1
    • 6.0.2.Final
    • Core
    • None

      I think I have found a problem with asynchronous get operation in Ispn-6.0.2. I am using it like this to read a set of values based on their IDs:

              for (String string : ids) {
                  cache.getAsync(string).attachListener(new FutureListener<MyClass>() {
                      @Override
                      public void futureDone(Future<MyClass> future) {
                          try {
                              queue.put(future.get());
                          } catch (InterruptedException | ExecutionException | NullPointerException ignore) {     }
                      }               
                  });
              }
      

      When I start to use it more heavily (hundreds of simultaneous reads) it happens to me that (probably all) the reading threads (transport-thread-0 to -24) got stuck in the "future.get()" method with this stack trace:

      Hidden Source Calls (Unsafe.park)
      LockSupport.park:186
      AbstractQueuedSynchronizer.parkAndCheckInterrupt:834
      AbstractQueuedSynchronizer.doAcquireSharedInterruptibly:994
      AbstractQueuedSynchronizer.acquireSharedInterrptibly:1303
      FutureTask$Sync.innerGet:248
      FutureTask.get:111
      NotifyingFutureAdaptor.get:44
      SomeMyClass$2.futureDone:113
      

      I understand it like this: the async read was finished because the .futureDone method was called, but the method cannot get to the result from "Future", which is very strange...

      When I rewrote the code so that it does not use the FutureListener (and thus it is in general less efficient), it works:

              Future<MyClass> [] futures = new Future [idCount];
              int counter = 0;
              for (String string : ids) {
                  futures[counter ++] = cacheToReadFrom.getAsync(string);
              }
              for (Future<MyClass> future : futures) {
                  try {
                      queue.put(future.get());
                  } catch (InterruptedException | ExecutionException | NullPointerException ignore) { }
              }
      

              dberinde@redhat.com Dan Berindei (Inactive)
              david.novak David Novak (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated:
                Resolved: