code: private Future<Boolean> _add(String key, int exp, CachedData value, EVCacheLatch latch) throws Exception {
          if (enableChunking.get()) throw new EVCacheException("This operation is not supported as chunking is enabled on this EVCacheClient.");
          if (addCounter == null) addCounter = EVCacheMetricsFactory.getCounter(serverGroup.getName() + "-AddCall");
  
          final MemcachedNode node = evcacheMemcachedClient.getEVCacheNode(key);
          if (!ensureWriteQueueSize(node, key)) return getDefaultFuture();
  
          addCounter.increment();
          if(shouldHashKey()) {
              final String hKey = getHashedKey(key);
              final CachedData cVal = getEVCacheValue(key, value, exp);
              return evcacheMemcachedClient.add(hKey, exp, cVal, null, latch);
          } else {
              return evcacheMemcachedClient.add(key, exp, value, null, latch);
          }
      }
docs: /*
  public boolean appendOrAdd(String key, CachedData value, int timeToLive) throws EVCacheException {
  int i = 0;
  try {
  do {
  final Future<Boolean> future = evcacheMemcachedClient.append(key, value);
  try {
  if(future.get(operationTimeout.get(), TimeUnit.MILLISECONDS) == Boolean.FALSE) {
  final Future<Boolean> f = evcacheMemcachedClient.add(key, timeToLive, value);
  if(f.get(operationTimeout.get(), TimeUnit.MILLISECONDS) == Boolean.TRUE) {
  return true;
  }
  } else {
  return true;
  }
  } catch(TimeoutException te) {
  return false;
  }
  } while(i++ < 2);
  } catch (Exception ex) {
  if (log.isDebugEnabled() ) log.debug("Exception appendOrAdd data for APP " + appName + ", key : " + key, ex);
  return false;
  }
  return false;
  }