CompletableFuture<Void> regionOpening(RegionStateNode regionNode) {
    // As in SCP, for performance reason, there is no TRSP attached with this region, we will not
    // update the region state, which means that the region could be in any state when we want to
    // assign it after a RS crash. So here we do not pass the expectedStates parameter.
    return transitStateAndUpdate(regionNode, State.OPENING).thenAccept(r -> {
      ServerStateNode serverNode = regionStates.getServerNode(regionNode.getRegionLocation());
      // Here the server node could be null. For example, we want to assign the region to a given
      // region server and it crashes, and it is the region server which holds hbase:meta, then the
      // above transitStateAndUpdate call will never succeed until we finishes the SCP for it. But
      // after the SCP finishes, the server node will be removed, so when we arrive there, the
      // server
      // node will be null. This is not a big problem if we skip adding it, as later we will fail to
      // execute the remote procedure on the region server and then try to assign to another region
      // server
      if (serverNode != null) {
        serverNode.addRegion(regionNode);
      }
      // update the operation count metrics
      metrics.incrementOperationCounter();
    });
  }
Resolve a cached {@link RegionInfo} from the encoded region name as a {@code String}.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java