code: @Override
      public boolean onShutdown(long timeout, TimeUnit unit) {
          if (nodeEngine.getLocalMember().isLiteMember()) {
              return true;
          }
          long timeoutNanos = unit.toNanos(timeout);
          for (CRDTReplicationAwareService service : getReplicationServices()) {
              service.prepareToSafeShutdown();
              final CRDTReplicationContainer replicationOperation = service.prepareReplicationOperation(
                      replicationVectorClocks.getLatestReplicatedVectorClock(service.getName()), 0);
              if (replicationOperation == null) {
                  logger.fine("Skipping replication since all CRDTs are replicated");
                  continue;
              }
              long start = System.nanoTime();
              if (!tryProcessOnOtherMembers(replicationOperation.getOperation(), service.getName(), timeoutNanos)) {
                  logger.warning("Failed replication of CRDTs for " + service.getName() + ". CRDT state may be lost.");
              }
              timeoutNanos -= (System.nanoTime() - start);
              if (timeoutNanos < 0) {
                  return false;
              }
          }
          return true;
      }
docs: Attempts to replicate only the unreplicated CRDT state to any non-local
  member in the cluster. The state may be unreplicated because the CRDT
  state has been changed (via mutation or merge with an another CRDT) but
  has not yet been disseminated through the usual replication mechanism
  to any member.
  This method will iterate through the member list and try and replicate
  to at least one member. The method returns once all of the unreplicated
  state has been replicated successfully or when there are no more members
  to attempt processing.
  This method will replicate all of the unreplicated CRDT states to any
  data member in the cluster, regardless if that member is actually the
  replica for some CRDT (because of a configured replica count). It is
  the responsibility of that member to migrate the state for which it is
  not a replica. The configured replica count can therefore be broken
  during shutdown to increase the chance of survival of unreplicated CRDT
  data (if the actual replicas are unreachable).
  
  @see CRDTReplicationTask