boolean allReplicasCaughtUpEarly() {
      return allReplicasCaughtUpEarly;
    }
This class is used to generate remote replica groups continuously for replication
Lifecycle of groups in this poller is as below
 1. For each data node, we create multiple sets of replicas and pre-assign group id to each set and store it in {@link ActiveGroupTracker#getPreAssignedReplicas()}
    These sets are stored as {@link DataNodeTracker#getActiveGroupTrackers()}
 2. We pre-assign group id for standBy group for each datanode and store it {@link DataNodeTracker#getStandByGroupTracker()}
 3. {@link #enqueue()} would try to create (and add back) those groups for these sets and group ids and
    store it in {@link DataNodeTracker#getActiveGroupTrackers()} and {@link DataNodeTracker#getStandByGroupTracker()}.
 4. Once a group finishes one iteration of work, include metadata exchange and data download,
    we remove group  from the {@link GroupTracker} and potentially backoff replicas in the group.
 5. If  any of the replicas of this group need to go through another iteration, we create group with group id as same as {@link ActiveGroupTracker#getGroupId()}
    the same group would be added back to {@link ActiveGroupTracker} with the available replicas only.
 6. While trying to create any group, if we find stand by replicas that have timed out,
    we will move replica to {@link ReplicaStatus#STANDBY_TIMED_OUT_ON_NO_PROGRESS} status.
 7. All standBy groups get created using the replicas with status {@link ReplicaStatus#STANDBY_TIMED_OUT_ON_NO_PROGRESS}
    of the data node and will be stored in {@link DataNodeTracker#getStandByGroupTracker()}
 8. When there is a new replica added to the thread, or a replica removed from this thread,
    or there is one group reaches max iteration, we don't create new groups, just return the existing ones,
    and after they all finish current iteration, {@link GroupTracker} will not be tracking any group and do-while loop would break.
ambry-replication/src/main/java/com/github/ambry/replication/ReplicaThread.java