docs: @Override
      public void onComplete(OperationFuture<?> future) throws Exception {
          if (log.isDebugEnabled()) log.debug("BEGIN : onComplete - Calling Countdown. Completed Future = " + future + "; App : " + appName); 
          countDown();
          completeCount++;
          if(getCompletedCount() >= getExpectedSuccessCount()) {
              final String cachePrefix = null;
              EVCacheMetricsFactory.getStatsTimer(getAppName(), cachePrefix, "LatchPolicyDuration").record(System.currentTimeMillis() - startTimeMS);
              if (log.isDebugEnabled()) log.debug("Future policy satisfied. Last Completed Future = " + future + ". Took " + (System.currentTimeMillis() - startTimeMS) + " milliseconds"); 
          }
          EVCacheMetricsFactory.increment(appName, null, "EVCacheLatchImpl-OnComplete");
          if(evcacheEvent != null) {
              if (log.isDebugEnabled()) log.debug(";App : " + evcacheEvent.getAppName() + "; Call : " + evcacheEvent.getCall() + "; Keys : " + evcacheEvent.getEVCacheKeys() + "; completeCount : " + completeCount + "; totalFutureCount : " + totalFutureCount +"; failureCount : " + failureCount);
              try {
                  if(future.isDone() && future.get().equals(Boolean.FALSE)) {
                      failureCount++;
                  }
              } catch (Exception e) {
                  failureCount++;
                  if(log.isDebugEnabled()) log.debug(e.getMessage(), e);
              }
              if(!onCompleteDone && getCompletedCount() >= getExpectedSuccessCount()) {
                  if(evcacheEvent.getClients().size() > 0) {
                      for(EVCacheClient client : evcacheEvent.getClients()) {
                          final List<EVCacheEventListener> evcacheEventListenerList = client.getPool().getEVCacheClientPoolManager().getEVCacheEventListeners();
                          for (EVCacheEventListener evcacheEventListener : evcacheEventListenerList) {
                              evcacheEventListener.onComplete(evcacheEvent);
                          }
                          EVCacheMetricsFactory.increment(evcacheEvent.getAppName(), evcacheEvent.getCacheName(), "EVCacheLatchImpl-OnComplete-Done");
                          onCompleteDone = true;//This ensures we fire onComplete only once
                          break;
                      }
                  }
              }
              if(scheduledFuture != null) {
                  final boolean futureCancelled = scheduledFuture.isCancelled(); 
                  if (log.isDebugEnabled()) log.debug("App : " + evcacheEvent.getAppName() + "; Call : " + evcacheEvent.getCall() + "; Keys : " + evcacheEvent.getEVCacheKeys() + "; completeCount : " + completeCount + "; totalFutureCount : " + totalFutureCount +"; failureCount : " + failureCount + "; futureCancelled : " + futureCancelled);
                  if(onCompleteDone && !futureCancelled) {
                      if(completeCount == totalFutureCount && failureCount == 0) { // all futures are completed
                          final boolean status = scheduledFuture.cancel(true);
                          if (log.isDebugEnabled()) log.debug("Cancelled the scheduled task : " + status);
                          if(status) {
                              EVCacheMetricsFactory.increment(evcacheEvent.getAppName(), evcacheEvent.getCacheName(), "EVCacheLatchImpl-OnComplete-FutureUnregistered-SUCCESS");
                          } else {
                              EVCacheMetricsFactory.increment(evcacheEvent.getAppName(), evcacheEvent.getCacheName(), "EVCacheLatchImpl-OnComplete-FutureUnregistered-FAIL");
                          }
                      }
                  }
              }
              if (log.isDebugEnabled()) log.debug("App : " + evcacheEvent.getAppName() + "; Call : " + evcacheEvent.getCall() + "; Keys : " + evcacheEvent.getEVCacheKeys() + "; completeCount : " + completeCount + "; totalFutureCount : " + totalFutureCount +"; failureCount : " + failureCount);
          }
          if (log.isDebugEnabled()) log.debug("END : onComplete - Calling Countdown. Completed Future = " + future + "; App : " + appName); 
      }