code: private ClientMessage invokeAddInternal(long delta, boolean getBeforeUpdate,
                                              List<Address> excludedAddresses,
                                              HazelcastException lastException,
                                              Address target) {
          if (target == null) {
              throw lastException != null
                      ? lastException
                      : new NoDataMemberInClusterException(
                      "Cannot invoke operations on a CRDT because the cluster does not contain any data members");
          }
          try {
              final ClientMessage request = PNCounterAddCodec.encodeRequest(
                      name, delta, getBeforeUpdate, observedClock.entrySet(), target);
              return invokeOnAddress(request, target);
          } catch (HazelcastException e) {
              logger.fine("Unable to provide session guarantees when sending operations to " + target
                      + ", choosing different target");
              if (excludedAddresses == EMPTY_ADDRESS_LIST) {
                  excludedAddresses = new ArrayList<Address>();
              }
              excludedAddresses.add(target);
              final Address newTarget = getCRDTOperationTarget(excludedAddresses);
              return invokeAddInternal(delta, getBeforeUpdate, excludedAddresses, e, newTarget);
          }
      }
docs: Adds the {@code delta} and returns the value of the counter before the
  update if {@code getBeforeUpdate} is {@code true} or the value after
  the update if it is {@code false}.
  It will invoke client messages recursively on viable replica addresses
  until successful or the list of viable replicas is exhausted.
  Replicas with addresses contained in the {@code excludedAddresses} are
  skipped. If there are no viable replicas, this method will throw the
  {@code lastException} if not {@code null} or a
  {@link NoDataMemberInClusterException} if the {@code lastException} is
  {@code null}.
  
  @param delta             the delta to add to the counter value, can be negative
  @param getBeforeUpdate   {@code true} if the operation should return the
  counter value before the addition, {@code false}
  if it should return the value after the addition
  @param excludedAddresses the addresses to exclude when choosing a replica
  address, must not be {@code null}
  @param lastException     the exception thrown from the last invocation of
  the {@code request} on a replica, may be {@code null}
  @return the result of the request invocation on a replica
  @throws NoDataMemberInClusterException if there are no replicas and the
  {@code lastException} is {@code null}