Ejemplo n.º 1
0
 /**
  * Analyze checkpoint directories. Create directories if they do not exist. Recover from an
  * unsuccessful checkpoint is necessary.
  *
  * @param dataDirs
  * @param editsDirs
  * @throws IOException
  */
 void recoverCreate(Collection<File> dataDirs, Collection<File> editsDirs) throws IOException {
   Collection<File> tempDataDirs = new ArrayList<File>(dataDirs);
   Collection<File> tempEditsDirs = new ArrayList<File>(editsDirs);
   this.storageDirs = new ArrayList<StorageDirectory>();
   setStorageDirectories(tempDataDirs, tempEditsDirs);
   for (Iterator<StorageDirectory> it = dirIterator(); it.hasNext(); ) {
     StorageDirectory sd = it.next();
     boolean isAccessible = true;
     try { // create directories if don't exist yet
       if (!sd.getRoot().mkdirs()) {
         // do nothing, directory is already created
       }
     } catch (SecurityException se) {
       isAccessible = false;
     }
     if (!isAccessible)
       throw new InconsistentFSStateException(
           sd.getRoot(), "cannot access checkpoint directory.");
     StorageState curState;
     try {
       curState = sd.analyzeStorage(HdfsConstants.StartupOption.REGULAR);
       // sd is locked but not opened
       switch (curState) {
         case NON_EXISTENT:
           // fail if any of the configured checkpoint dirs are inaccessible
           throw new InconsistentFSStateException(
               sd.getRoot(), "checkpoint directory does not exist or is not accessible.");
         case NOT_FORMATTED:
           break; // it's ok since initially there is no current and VERSION
         case NORMAL:
           break;
         default: // recovery is possible
           sd.doRecover(curState);
       }
     } catch (IOException ioe) {
       sd.unlock();
       throw ioe;
     }
   }
 }