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

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

    Details

    • Type: Bug
    • Status: Closed (View Workflow)
    • Priority: Minor
    • Resolution: Done
    • Affects Version/s: 6.0.2.Final
    • Fix Version/s: 7.0.0.Alpha1
    • Component/s: Core
    • Labels:
      None
    • Environment:

      Using a single Ispn node, using single file persistance

      Description

      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) { }
              }
      

        Gliffy Diagrams

          Attachments

            Activity

              People

              • Assignee:
                dan.berindei Dan Berindei
                Reporter:
                david.novak David Novak
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: