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

Deadlock in RemoteCache getAsync

    XMLWordPrintable

    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.

        Attachments

          Issue Links

            Activity

              People

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

                Dates

                Created:
                Updated:
                Resolved: