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

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

              Dates

                Created:
                Updated:
                Resolved: