private void mirrorMetaLocations() throws IOException, KeeperException {
    // For compatibility, mirror the meta region state to zookeeper
    // And we still need to use zookeeper to publish the meta region locations to region
    // server, so they can serve as ClientMetaService
    ZKWatcher zk = master.getZooKeeper();
    if (zk == null || !zk.getRecoverableZooKeeper().getState().isAlive()) {
      // this is possible in tests, we do not provide a zk watcher or the zk watcher has been closed
      return;
    }
    Collection<RegionStateNode> metaStates = regionStates.getRegionStateNodes();
    for (RegionStateNode metaState : metaStates) {
      MetaTableLocator.setMetaLocation(zk, metaState.getRegionLocation(),
        metaState.getRegionInfo().getReplicaId(), metaState.getState());
    }
    int replicaCount = metaStates.size();
    // remove extra mirror locations
    for (String znode : zk.getMetaReplicaNodes()) {
      int replicaId = zk.getZNodePaths().getMetaReplicaIdFromZNode(znode);
      if (replicaId >= replicaCount) {
        MetaTableLocator.deleteMetaLocation(zk, replicaId);
      }
    }
  }
When the operator uses this configuration option, any version between the current cluster
version and the value of "hbase.min.version.move.system.tables" does not trigger any
auto-region movement. Auto-region movement here refers to auto-migration of system table
regions to newer server versions. It is assumed that the configured range of versions does not
require special handling of moving system table regions to higher versioned RegionServer. This
auto-migration is done by {@link #checkIfShouldMoveSystemRegionAsync()}. Example: Let's assume
the cluster is on version 1.4.0 and we have set "hbase.min.version.move.system.tables" as
"2.0.0". Now if we upgrade one RegionServer on 1.4.0 cluster to 1.6.0 (< 2.0.0), then
AssignmentManager will not move hbase:meta, hbase:namespace and other system table regions to
newly brought up RegionServer 1.6.0 as part of auto-migration. However, if we upgrade one
RegionServer on 1.4.0 cluster to 2.2.0 (> 2.0.0), then AssignmentManager will move all system
table regions to newly brought up RegionServer 2.2.0 as part of auto-migration done by
{@link #checkIfShouldMoveSystemRegionAsync()}. "hbase.min.version.move.system.tables" is
introduced as part of HBASE-22923.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java