public synchronized void start() {
   if (isRunning) {
     return;
   }
   // report if checkpoint incomplete/invalid
   if (getRecoveryCheckpoint() != null) {
     File cpDir = getRecoveryCheckpoint().getCheckpointDir().getFile();
     if (!Checkpoint.hasValidStamp(cpDir)) {
       LOGGER.severe(
           "checkpoint '"
               + cpDir.getAbsolutePath()
               + "' missing validity stamp file; checkpoint data "
               + "may be missing or otherwise corrupt.");
     }
   }
   this.isRunning = true;
   setupCheckpointTask();
 }
 /**
  * Returns a list of available, valid (contains 'valid' file) checkpoint directories, as File
  * instances, with the more recently-written appearing first.
  *
  * @return List of valid checkpoint directory File instances
  */
 @SuppressWarnings("unchecked")
 public List<File> findAvailableCheckpointDirectories() {
   File[] dirs =
       getCheckpointsDir().getFile().listFiles((FileFilter) FileFilterUtils.directoryFileFilter());
   if (dirs == null) {
     return Collections.EMPTY_LIST;
   }
   Arrays.sort(dirs, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
   LinkedList<File> dirsList = new LinkedList<File>(Arrays.asList(dirs));
   Iterator<File> iter = dirsList.iterator();
   while (iter.hasNext()) {
     File cpDir = iter.next();
     if (!Checkpoint.hasValidStamp(cpDir)) {
       LOGGER.warning("checkpoint '" + cpDir + "' missing validity stamp file; ignoring");
       iter.remove();
     }
   }
   return dirsList;
 }