In RSGroupBasedLoadBalancer#balanceCluster(clusterState), the logic could be improved:
correctAssignment() builds a map for mis-placed and placed regions. For mis-placed regions, the key(ServerName) is BOGUS_SERVER_NAME. Then the logic gets those mis-paced regions out and calls findServerForRegion() several times to find out the current host server, in order to build RegionPlan for movement.
Some logic in correctAssignment() and findServerForRegion() could be merged so as to build both corrected assignment and RegionPlan for mis-placed region in one pass. As a result, findServerForRegion() could be removed if I get it correctly.