@Override
  public boolean nextStep() {
    boolean attemptedOperation = false;
    if (removeOverRedundancy) {
      attemptedOperation = removeOverRedundancyDirector.nextStep();
    }
    if (!attemptedOperation) {
      removeOverRedundancy = false;
    }

    if (!attemptedOperation && satisfyRedundancy) {
      attemptedOperation = satisfyRedundancyDirector.nextStep();
    }
    if (!attemptedOperation) {
      satisfyRedundancy = false;
    }

    if (!attemptedOperation && moveBuckets) {
      attemptedOperation = moveBucketsDirector.nextStep();
    }
    if (!attemptedOperation) {
      moveBuckets = false;
    }

    if (!attemptedOperation && movePrimaries) {
      attemptedOperation = movePrimariesDirector.nextStep();
    }
    if (!attemptedOperation) {
      movePrimaries = false;
    }

    return attemptedOperation;
  }
@param removeOverRedundancy true to remove buckets that exceed redundancy levels
@param satisfyRedundancy true to satisfy redundancy as part of the operation
@param moveBuckets true to move buckets as part of the operation
@param movePrimaries true to move primaries as part of the operation
geode-core/src/main/java/org/apache/geode/internal/cache/partitioned/rebalance/CompositeDirector.java