private List<BackfillData> populateAndGetBackfillInfoData(long lowestFinishTime) {
    List<BackfillInfo> backfillInfos = BackfillInfo.find.select("*").findList();
    // No data in backfill_info table.
    if (backfillInfos == null) {
      return null;
    }
    Map<ApplicationType, Long> tempBackfillMap = new HashMap<ApplicationType, Long>(backfillInfos.size());
    List<BackfillData> backfillDataList = new ArrayList<BackfillData>(backfillInfos.size());
    long currentTs = System.currentTimeMillis();
    // As number of app types would be limited, we do not expect this operation to be very expensive.
    for (BackfillInfo info : backfillInfos) {
      ApplicationType appType = getAppTypeForName(info.appType);
      long backfillTs = info.backfillTs;
      if (_initialFetchWindow > 0) {
        // Limit the apps to be backfilled based on initial fetch window. Initial fetch window configuration is used
        // to limit apps loaded from RM on Dr.Elephant startup. Hence, we need not backfill apps beyond the initial
        // fetch window as well.
        if (backfillTs < currentTs - _initialFetchWindow) {
          backfillTs = currentTs - _initialFetchWindow;
        }
      }
      tempBackfillMap.put(appType, backfillTs);
      ElephantBackfillFetcher backfillFetcher = getBackfillFetcher(appType);
      if (backfillFetcher == null) {
        logger.info("Fetcher configured for appType=" + appType.getName() + " does not support backfill.");
        continue;
      }
      if (lowestFinishTime < backfillTs) {
        continue;
      }
      backfillDataList.add(new BackfillData(appType, backfillTs, backfillFetcher));
    }
    _appTypeToBackfillTs = Collections.unmodifiableMap(tempBackfillMap);
    return backfillDataList;
  }
The class that runs the Dr. Elephant daemon
app/com/linkedin/drelephant/ElephantRunner.java