private InternalDistributedMember waitForNodeOrCreateBucket(RetryTimeKeeper retryTime,
      EntryEventImpl event, Integer bucketId) {
    InternalDistributedMember newNode;
    if (retryTime.overMaximum()) {
      PRHARedundancyProvider.timedOut(this, null, null, "allocate a bucket",
          retryTime.getRetryTime());
      // NOTREACHED
    }

    retryTime.waitForBucketsRecovery();
    newNode = getNodeForBucketWrite(bucketId, retryTime);
    if (newNode == null) {
      newNode = createBucket(bucketId, getEntrySize(event), retryTime);
    }

    return newNode;
  }
Find an existing live Node that owns the bucket, or create the bucket and return one of its
owners.

@param retryTime the RetryTimeKeeper to track retry times
@param event the event used to get the entry size in the event a new bucket should be created
@param bucketId the identity of the bucket should it be created
@return a Node which contains the bucket, potentially null
geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java