code: private ScanStatus createNewScanFromExistingScan(String scanId, ScanOptions scanOptions, ScanStatus existingScanStatus) {
          List<ScanRangeStatus> pendingScanRangeStatuses = Lists.newArrayList();
          Multimap<String, ScanRangeStatus> scanRangeStatusesByPlacement = HashMultimap.create();
  
          for (ScanRangeStatus scanRangeStatus : existingScanStatus.getAllScanRanges()) {
              scanRangeStatusesByPlacement.put(scanRangeStatus.getPlacement(),
                      new ScanRangeStatus(
                              scanRangeStatus.getTaskId(), scanRangeStatus.getPlacement(), scanRangeStatus.getScanRange(),
                              scanRangeStatus.getBatchId(), scanRangeStatus.getBlockedByBatchId(), scanRangeStatus.getConcurrencyId()));
          }
  
          for (String placement : scanOptions.getPlacements()) {
              Collection<ScanRangeStatus> scanRangeStatusesForPlacement = scanRangeStatusesByPlacement.get(placement);
  
              if (scanRangeStatusesForPlacement.isEmpty()) {
                  throw new IllegalStateException(String.format("Previous scan \"%s\" had no plan for placement \"%s\"", scanId, placement));
              }
  
              pendingScanRangeStatuses.addAll(scanRangeStatusesForPlacement);
          }
  
          return new ScanStatus(scanId, scanOptions, false, false, new Date(), pendingScanRangeStatuses,
                  ImmutableList.of(), ImmutableList.of());
      }
docs: Takes an existing ScanStatus and creates a new plan from it.  This method validates that a plan existed for each
  placement in the existing ScanStatus but otherwise recreates the plan exactly as it ran.  This means that any
  ScanOptions related to generating the plan, such as {@link ScanOptions#getRangeScanSplitSize()} and
  {@link ScanOptions#isScanByAZ()}, will have no effect.