code: public void updateProgressRate(long currentTime) {
  
      double bestProgressRate = 0;
  
      for (TaskStatus ts : taskStatuses.values()){
        if (ts.getRunState() == TaskStatus.State.RUNNING  || 
            ts.getRunState() == TaskStatus.State.SUCCEEDED ||
            ts.getRunState() == TaskStatus.State.COMMIT_PENDING) {
  
          double tsProgressRate = ts.getProgress()/Math.max(1,
              currentTime - getDispatchTime(ts.getTaskID()));
          if (tsProgressRate > bestProgressRate){
            bestProgressRate = tsProgressRate;
          }
        }
      }
  
      DataStatistics taskStats = job.getRunningTaskStatistics(isMapTask());
      taskStats.updateStatistics(progressRate, bestProgressRate);
  
      progressRate = bestProgressRate;
    }
docs: update progress rate for a task
  
  The assumption is that the JIP lock is held entering this routine.
  So it's left unsynchronized. Currently the only places it's called
  from are TIP.updateStatus and JIP.refreshCandidate*