code: private void updateOnAccessAndCommit(long blockId) {
      synchronized (mBlockIdToLastUpdateTime) {
        long currentLogicTime = mLogicTimeCount.incrementAndGet();
        // update CRF value
        // CRF(currentLogicTime)=CRF(lastUpdateTime)*F(currentLogicTime-lastUpdateTime)+F(0)
        if (mBlockIdToCRFValue.containsKey(blockId)) {
          mBlockIdToCRFValue.put(blockId, mBlockIdToCRFValue.get(blockId)
              * calculateAccessWeight(currentLogicTime - mBlockIdToLastUpdateTime.get(blockId))
              + 1.0);
        } else {
          mBlockIdToCRFValue.put(blockId, 1.0);
        }
        // update currentLogicTime to lastUpdateTime
        mBlockIdToLastUpdateTime.put(blockId, currentLogicTime);
      }
    }
docs: Updates {@link #mBlockIdToLastUpdateTime} and {@link #mBlockIdToCRFValue} when block is
  accessed or committed. Only CRF of the accessed or committed block will be updated, CRF
  of other blocks will be lazily updated (only when {@link #updateCRFValue()} is called).
  If the block is updated at the first time, CRF of the block will be set to 1.0, otherwise
  the CRF of the block will be set to {1.0 + old CRF * F(current time - last update time)}.
  
  @param blockId id of the block to be accessed or committed