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

Deadlock in RemoteCache getAsync

    Details

      Description

      Here is the implementation of remoteCahe.getAsync() :

       public NotifyingFuture<V> getAsync(final K key) {
            assertRemoteCacheManagerIsStarted();
            final NotifyingFutureImpl<V> result = new NotifyingFutureImpl<V>();
            Future<V> future = executorService.submit(new Callable<V>() {
               @Override
               public V call() throws Exception {
                  V toReturn = get(key);
                  result.notifyFutureCompletion();
                  return toReturn;
               }
            });
            result.setExecuting(future);
            return result;
         }
      

      2 problems here :

      1. Callable's call method might be called BEFORE calling client had a chance to add listener (i.e. getAsync is not returned yet), in this case its' listener futureDone method will never be called.

      2. Even case #1 has not happened and notifyFutureCompletion is called on listener, but the future is not resolved yet : "call" has not returned, that's why the future that is passed to listener is not resolved, and calling future.get from listener blocks forever.

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  mircea.markus Mircea Markus
                  Reporter:
                  furic Alexander Furer
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  5 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: