@Override
    public Void call() throws Exception {
      if (LOG.isDebugEnabled()) {
        LOG.debug("DRPC started: " + rss.getServerName());
      }

      AbstractFSWAL<?> fsWAL = (AbstractFSWAL<?>) rss.getWAL(null);
      long filenum = fsWAL.getFilenum();
      List<WAL> wals = rss.getWALs();
      long highest = -1;
      for (WAL wal : wals) {
        if (wal == null) {
          continue;
        }

        if (((AbstractFSWAL<?>) wal).getFilenum() > highest) {
          highest = ((AbstractFSWAL<?>) wal).getFilenum();
        }
      }

      LOG.info("Trying to roll log in backup subprocedure, current log number: " + filenum
        + " highest: " + highest + " on " + rss.getServerName());
      ((HRegionServer) rss).getWalRoller().requestRollAll();
      long start = EnvironmentEdgeManager.currentTime();
      while (!((HRegionServer) rss).getWalRoller().walRollFinished()) {
        Thread.sleep(20);
      }
      LOG.debug("log roll took " + (EnvironmentEdgeManager.currentTime() - start));
      LOG.info("After roll log in backup subprocedure, current log number: " + fsWAL.getFilenum()
        + " on " + rss.getServerName());

      Connection connection = rss.getConnection();
      try (final BackupSystemTable table = new BackupSystemTable(connection)) {
        // sanity check, good for testing
        HashMap<String, Long> serverTimestampMap =
          table.readRegionServerLastLogRollResult(backupRoot);
        String host = rss.getServerName().getHostname();
        int port = rss.getServerName().getPort();
        String server = host + ":" + port;
        Long sts = serverTimestampMap.get(host);
        if (sts != null && sts > highest) {
          LOG
            .warn("Won't update server's last roll log result: current=" + sts + " new=" + highest);
          return null;
        }
        // write the log number to backup system table.
        table.writeRegionServerLastLogRollResult(server, highest, backupRoot);
        return null;
      } catch (Exception e) {
        LOG.error(e.toString(), e);
        throw e;
      }
    }
Callable task. TODO. We don't need a thread pool to execute roll log. This can be simplified
with no use of sub-procedure pool.
hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/regionserver/LogRollBackupSubprocedure.java