private String fancyFormatBucketAllocation(String prefix, Iterable<DataStoreBuckets> dataStores,
      Collection<InternalDistributedMember> existingStores) {
    StringBuilder logStr = new StringBuilder();
    if (prefix != null) {
      logStr.append(prefix);
    }
    logStr.append("Bucket Allocation for prId=").append(partitionedRegion.getPRId()).append(":");
    logStr.append(lineSeparator());

    for (Object dataStore : dataStores) {
      DataStoreBuckets buckets = (DataStoreBuckets) dataStore;
      logStr.append(buckets.memberId()).append(": ");
      if (existingStores.contains(buckets.memberId())) {
        logStr.append("+");
      } else {
        logStr.append("-");
      }
      logStr.append(buckets.numPrimaries());
      logStr.append("/");
      logStr.append(buckets.numBuckets() - buckets.numPrimaries());

      logStr.append(lineSeparator());
    }
    return logStr.toString();
  }
Log bucket allocation in the log files in this format:

<pre>
member1: +5/20
member2: -10/5
</pre>

<p>
After the member name, the +/- indicates whether or not this bucket is already hosted on the
given member. This is followed by the number of hosted primaries followed by the number of
hosted non-primary buckets.

@param prefix first part of message to print
@param dataStores list of stores
@param existingStores to mark those already in use
geode-core/src/main/java/org/apache/geode/internal/cache/PRHARedundancyProvider.java