@Override
  public Optional<RemoteOperation> remoteCallBuild(MasterProcedureEnv env, ServerName serverName) {
    return Optional
      .of(new RSProcedureDispatcher.ServerOperation(this, getProcId(), SnapshotRegionCallable.class,
        MasterProcedureProtos.SnapshotRegionParameter.newBuilder()
          .setRegion(ProtobufUtil.toRegionInfo(region)).setSnapshot(snapshot).build().toByteArray(),
        env.getMasterServices().getMasterActiveTime()));
  }
A remote procedure which is used to send region snapshot request to region server. The basic
logic of SnapshotRegionProcedure is similar like {@link ServerRemoteProcedure}, only with a
little difference, when {@link FailedRemoteDispatchException} was thrown, SnapshotRegionProcedure
will sleep some time and continue retrying until success.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SnapshotRegionProcedure.java