private void processFinishedGroups() {
      List<RemoteReplicaGroup> finishedGroups = dataNodeTrackers.stream()
          .map(DataNodeTracker::processFinishedGroups)
          .flatMap(List::stream)
          .collect(Collectors.toList());

      finishedGroups.forEach(remoteReplicaGroup -> {
        storeKeyConverter.tryDropCache(remoteReplicaGroup.getStoreKeysConversionLog());
        logger.trace("Thread name: {} group id {} is done and removed from group tracker", threadName, remoteReplicaGroup.getId());
      });

      logger.trace("Thread name: {} Finished processing finished groups {}", threadName, dataNodeTrackers);
    }
For each data node tracker, if any remote replica group is done,
removes remote replica group from tracking, throttles replicas added in this group,
throttles corresponding replica and moves its state to UNKNOWN
For these finished groups, drops keys from store key converter
ambry-replication/src/main/java/com/github/ambry/replication/ReplicaThread.java