@RestrictedApi(explanation = "Should only be called in ScheduledChore", link = "",
      allowedOnPath = ".*/org/apache/hadoop/hbase/ScheduledChore.java")
  synchronized void onChoreMissedStartTime(ScheduledChore chore) {
    if (!scheduledChores.containsKey(chore)) {
      return;
    }

    // If the chore has not caused an increase in the size of the core thread pool then request an
    // increase. This allows each chore missing its start time to increase the core pool size by
    // at most 1.
    if (!choresMissingStartTime.containsKey(chore) || !choresMissingStartTime.get(chore)) {
      choresMissingStartTime.put(chore, requestCorePoolIncrease());
    }

    // Must reschedule the chore to prevent unnecessary delays of chores in the scheduler. If
    // the chore is NOT rescheduled, future executions of this chore will be delayed more and
    // more on each iteration. This hurts us because the ScheduledThreadPoolExecutor allocates
    // idle threads to chores based on how delayed they are.
    rescheduleChore(chore, false);
    printChoreDetails("onChoreMissedStartTime", chore);
  }
A callback that tells the implementer of this interface that one of the scheduled chores is
missing its start time. The implication of a chore missing its start time is that the service's
current means of scheduling may not be sufficient to handle the number of ongoing chores (the
other explanation is that the chore's execution time is greater than its scheduled period). The
service should try to increase its concurrency when this callback is received.
@param chore The chore that missed its start time
hbase-common/src/main/java/org/apache/hadoop/hbase/ChoreService.java