public void start(Map<byte[], List<Cell>> familyMaps) throws RegionTooBusyException {
    if (!isEnable()) {
      return;
    }

    StringBuilder tooBusyStore = new StringBuilder();
    boolean aboveParallelThreadLimit = false;
    boolean aboveParallelPrePutLimit = false;

    for (Map.Entry<byte[], List<Cell>> e : familyMaps.entrySet()) {
      Store store = this.region.getStore(e.getKey());
      if (store == null || e.getValue() == null) {
        continue;
      }

      if (e.getValue().size() > this.parallelPutToStoreThreadLimitCheckMinColumnCount) {

        // we need to try to add #preparePutCount at first because preparePutToStoreMap will be
        // cleared when changing the configuration.
        int preparePutCount = preparePutToStoreMap
          .computeIfAbsent(e.getKey(), key -> new AtomicInteger()).incrementAndGet();
        boolean storeAboveThread =
          store.getCurrentParallelPutCount() > this.parallelPutToStoreThreadLimit;
        boolean storeAbovePrePut = preparePutCount > this.parallelPreparePutToStoreThreadLimit;
        if (storeAboveThread || storeAbovePrePut) {
          if (tooBusyStore.length() > 0) {
            tooBusyStore.append(',');
          }
          tooBusyStore.append(store.getColumnFamilyName());
        }
        aboveParallelThreadLimit |= storeAboveThread;
        aboveParallelPrePutLimit |= storeAbovePrePut;

        if (LOG.isTraceEnabled()) {
          LOG.trace(store.getColumnFamilyName() + ": preparePutCount=" + preparePutCount
            + "; currentParallelPutCount=" + store.getCurrentParallelPutCount());
        }
      }
    }

    if (aboveParallelThreadLimit || aboveParallelPrePutLimit) {
      String msg = "StoreTooBusy," + this.region.getRegionInfo().getRegionNameAsString() + ":"
        + tooBusyStore + " Above "
        + (aboveParallelThreadLimit
          ? "parallelPutToStoreThreadLimit(" + this.parallelPutToStoreThreadLimit + ")"
          : "")
        + (aboveParallelThreadLimit && aboveParallelPrePutLimit ? " or " : "")
        + (aboveParallelPrePutLimit
          ? "parallelPreparePutToStoreThreadLimit(" + this.parallelPreparePutToStoreThreadLimit
            + ")"
          : "");
      LOG.trace(msg);
      throw new RegionTooBusyException(msg);
    }
  }
{@link #init(Configuration)} is called for every Store that opens on a RegionServer. Here we
make a lightweight attempt to log this message once per RegionServer, rather than per-Store.
The goal is just to draw attention to this feature if debugging overload due to heavy writes.
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/throttle/StoreHotnessProtector.java