@Override
  protected synchronized boolean complete(MasterProcedureEnv env, Throwable error) {
    boolean isProcedureCompleted = false;
    try {
      if (error != null) {
        if (error instanceof RemoteProcedureException) {
          // remote operation failed
          Throwable remoteEx = unwrapRemoteProcedureException((RemoteProcedureException) error);
          if (remoteEx instanceof CorruptedSnapshotException) {
            // snapshot is corrupted, will touch a flag file and finish the procedure
            isProcedureCompleted = true;
            SnapshotProcedure parent = env.getMasterServices().getMasterProcedureExecutor()
              .getProcedure(SnapshotProcedure.class, getParentProcId());
            if (parent != null) {
              parent.markSnapshotCorrupted();
            }
          } // else unexpected exception in remote server, will retry on other servers,
            // procedureCompleted will stay false
        } // else the mostly like thing is that remote call failed, will retry on other servers,
          // procedureCompleted will stay false
      } else {
        // remote operation finished without error
        isProcedureCompleted = true;
      }
    } catch (IOException e) {
      // if we can't create the flag file, then mark the current procedure as FAILED
      // and rollback the whole snapshot procedure stack.
      LOG.warn("Failed create corrupted snapshot flag file for snapshot={}, region={}",
        snapshot.getName(), region, e);
      setFailure("verify-snapshot", e);
    } finally {
      // release the worker
      env.getMasterServices().getSnapshotManager().releaseSnapshotVerifyWorker(this, targetServer,
        env.getProcedureScheduler());
    }
    return isProcedureCompleted;
  }
A remote procedure which is used to send verify snapshot request to region server.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SnapshotVerifyProcedure.java