public void createRedundantBucket(final BucketRollup bucket, final Member targetMember) {
    Map<String, Long> colocatedRegionSizes = getColocatedRegionSizes(bucket);
    final Move move = new Move(null, targetMember, bucket);

    lowRedundancyBuckets.remove(bucket);
    bucket.addMember(targetMember);
    // put the bucket back into the list if we still need to satisfy redundancy for
    // this bucket
    if (bucket.getRedundancy() < requiredRedundancy) {
      lowRedundancyBuckets.add(bucket);
    }
    resetAverages();

    operator.createRedundantBucket(targetMember.getMemberId(), bucket.getId(),
        colocatedRegionSizes, new BucketOperator.Completion() {
          @Override
          public void onSuccess() {}

          @Override
          public void onFailure() {
            // If the bucket creation failed, we need to undo the changes
            // we made to the model
            attemptedBucketCreations.add(move);
            // remove the bucket from lowRedundancyBuckets before mutating the state
            lowRedundancyBuckets.remove(bucket);
            bucket.removeMember(targetMember);
            if (bucket.getRedundancy() < requiredRedundancy) {
              lowRedundancyBuckets.add(bucket);
            }
            resetAverages();
          }
        });
  }
Trigger the creation of a redundant bucket, potentially asynchronously.

This method will find the best node to create a redundant bucket and invoke the bucket operator
to create a bucket on that node. Because the bucket operator is asynchronous, the bucket may
not be created immediately, but the model will be updated regardless. Invoke
{@link #waitForOperations()} to wait for those operations to actually complete

@param bucket the bucket for which a redundant copy should be made
@param targetMember the member on which a redundant copy of a bucket should be made
geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/rebalance/model/PartitionedRegionLoadModel.java