@Override
  public long getBackoffTime(ServerName serverName, byte[] region, ServerStatistics stats) {
    // no stats for the server yet, so don't backoff
    if (stats == null) {
      return 0;
    }

    ServerStatistics.RegionStatistics regionStats = stats.getStatsForRegion(region);
    // no stats for the region yet - don't backoff
    if (regionStats == null) {
      return 0;
    }

    // Factor in memstore load
    double percent = regionStats.getMemStoreLoadPercent() / 100.0;

    // Factor in heap occupancy
    float heapOccupancy = regionStats.getHeapOccupancyPercent() / 100.0f;

    // Factor in compaction pressure, 1.0 means heavy compaction pressure
    float compactionPressure = regionStats.getCompactionPressure() / 100.0f;
    if (heapOccupancy >= heapOccupancyLowWatermark) {
      // If we are higher than the high watermark, we are already applying max
      // backoff and cannot scale more (see scale() below)
      if (heapOccupancy > heapOccupancyHighWatermark) {
        heapOccupancy = heapOccupancyHighWatermark;
      }
      percent = Math.max(percent,
        scale(heapOccupancy, heapOccupancyLowWatermark, heapOccupancyHighWatermark, 0.1, 1.0));
    }
    percent = Math.max(percent, compactionPressure);
    // square the percent as a value less than 1. Closer we move to 100 percent,
    // the percent moves to 1, but squaring causes the exponential curve
    double multiplier = Math.pow(percent, 4.0);
    if (multiplier > 1) {
      multiplier = 1;
    }
    return (long) (multiplier * maxBackoff);
  }
Simple exponential backoff policy on for the client that uses a percent^4 times the max backoff
to generate the backoff time.
hbase-client/src/main/java/org/apache/hadoop/hbase/client/backoff/ExponentialClientBackoffPolicy.java