code: @Override
      public Future<M> requestData() {
          logger.debug(this + " requestData...");
          try {
              validateInitialization();
              synchronized (syncMonitor) {
  
                  // Check if sync is in process.
                  if (syncFuture != null && !syncFuture.isDone()) {
  
                      // Recover sync task if it was canceled for instance during remote reinitialization.
                      if (syncTask == null || syncTask.isDone()) {
                          syncTask = sync();
                      }
                      return syncFuture;
                  } else {
                      // cleanup old sync task
                      if (syncTask != null && !syncTask.isDone()) {
                          syncTask.cancel(true);
                      }
                  }
  
                  // Create new sync process
                  syncFuture = new CompletableFutureLite();
                  syncTask = sync();
                  return syncFuture;
              }
          } catch (CouldNotPerformException ex) {
              return FutureProcessor.canceledFuture(new CouldNotPerformException("Could not request data!", ex));
          }
      }
docs: {@inheritDoc}
  
  @return {@inheritDoc}