docs: private long invokeInternal(Operation operation, List<Address> excludedAddresses,
                                  HazelcastException lastException) {
          final Address target = getCRDTOperationTarget(excludedAddresses);
          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 InvocationBuilder builder = getNodeEngine().getOperationService()
                                                               .createInvocationBuilder(SERVICE_NAME, operation, target);
              if (operationTryCount > 0) {
                  builder.setTryCount(operationTryCount);
              }
              final InternalCompletableFuture<CRDTTimestampedLong> future = builder.invoke();
              final CRDTTimestampedLong result = future.join();
              updateObservedReplicaTimestamps(result.getVectorClock());
              return result.getValue();
          } catch (HazelcastException e) {
              logger.fine("Exception occurred while invoking operation on target " + target + ", choosing different target", e);
              if (excludedAddresses == EMPTY_ADDRESS_LIST) {
                  excludedAddresses = new ArrayList<Address>();
              }
              excludedAddresses.add(target);
              return invokeInternal(operation, excludedAddresses, e);
          }
      }