[infinispan-issues] [JBoss JIRA] (ISPN-4493) Future.get() never finish after getAsync() with FutureListener

David Novak (JIRA) issues at jboss.org
Thu Jul 10 05:03:24 EDT 2014


David Novak created ISPN-4493:
---------------------------------

             Summary: Future.get() never finish after getAsync() with FutureListener
                 Key: ISPN-4493
                 URL: https://issues.jboss.org/browse/ISPN-4493
             Project: Infinispan
          Issue Type: Bug
      Security Level: Public (Everyone can see)
          Components: Core
    Affects Versions: 6.0.2.Final
         Environment: Using a single Ispn node, using single file persistance
            Reporter: David Novak
            Assignee: Dan Berindei
            Priority: Minor


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



--
This message was sent by Atlassian JIRA
(v6.2.6#6264)


More information about the infinispan-issues mailing list