Ejemplo n.º 1
0
 private StorageDirectory loadStorageDirectory(
     DataNode datanode, NamespaceInfo nsInfo, File dataDir, StartupOption startOpt)
     throws IOException {
   StorageDirectory sd = new StorageDirectory(dataDir, null, false);
   try {
     StorageState curState = sd.analyzeStorage(startOpt, this);
     switch (curState) {
       case NORMAL:
         break;
       case NON_EXISTENT:
         LOG.info("Storage directory " + dataDir + " does not exist");
         throw new IOException("Storage directory " + dataDir + " does not exist");
       case NOT_FORMATTED: // format
         LOG.info(
             "Storage directory " + dataDir + " is not formatted for " + nsInfo.getBlockPoolID());
         LOG.info("Formatting ...");
         format(sd, nsInfo, datanode.getDatanodeUuid());
         break;
       default:
         throw new RuntimeException("未实现");
     }
     doTransition(datanode, sd, nsInfo, startOpt);
     writeProperties(sd);
     return sd;
   } catch (IOException ioe) {
     sd.unlock();
     throw ioe;
   }
 }
  /**
   * Load one storage directory. Recover from previous transitions if required.
   *
   * @param datanode datanode instance
   * @param nsInfo namespace information
   * @param dataDir the root path of the storage directory
   * @param startOpt startup option
   * @return the StorageDirectory successfully loaded.
   * @throws IOException
   */
  private StorageDirectory loadStorageDirectory(
      DataNode datanode, NamespaceInfo nsInfo, File dataDir, StartupOption startOpt)
      throws IOException {
    StorageDirectory sd = new StorageDirectory(dataDir, null, true);
    try {
      StorageState curState = sd.analyzeStorage(startOpt, this);
      // sd is locked but not opened
      switch (curState) {
        case NORMAL:
          break;
        case NON_EXISTENT:
          LOG.info("Block pool storage directory " + dataDir + " does not exist");
          throw new IOException("Storage directory " + dataDir + " does not exist");
        case NOT_FORMATTED: // format
          LOG.info(
              "Block pool storage directory "
                  + dataDir
                  + " is not formatted for "
                  + nsInfo.getBlockPoolID());
          LOG.info("Formatting ...");
          format(sd, nsInfo);
          break;
        default: // recovery part is common
          sd.doRecover(curState);
      }

      // 2. Do transitions
      // Each storage directory is treated individually.
      // During startup some of them can upgrade or roll back
      // while others could be up-to-date for the regular startup.
      doTransition(datanode, sd, nsInfo, startOpt);
      if (getCTime() != nsInfo.getCTime()) {
        throw new IOException("Data-node and name-node CTimes must be the same.");
      }

      // 3. Update successfully loaded storage.
      setServiceLayoutVersion(getServiceLayoutVersion());
      writeProperties(sd);

      return sd;
    } catch (IOException ioe) {
      sd.unlock();
      throw ioe;
    }
  }
Ejemplo n.º 3
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;
     }
   }
 }
Ejemplo n.º 4
0
 private StorageDirectory loadStorageDirectory(
     DataNode datanode, NamespaceInfo nsInfo, File dataDir, StartupOption startOpt)
     throws IOException {
   StorageDirectory sd = new StorageDirectory(dataDir, null, true);
   try {
     StorageState curState = sd.analyzeStorage(startOpt, this);
     switch (curState) {
       case NORMAL:
         break;
       case NON_EXISTENT:
         LOG.info("Block pool storage directory " + dataDir + " does not exist");
         throw new IOException("Storage directory " + dataDir + " does not exist");
       case NOT_FORMATTED: // format
         LOG.info(
             "Block pool storage directory "
                 + dataDir
                 + " is not formatted for "
                 + nsInfo.getBlockPoolID());
         LOG.info("Formatting ...");
         format(sd, nsInfo);
         break;
       default:
         throw new RuntimeException("未实现");
     }
     doTransition(datanode, sd, nsInfo, startOpt);
     if (getCTime() != nsInfo.getCTime()) {
       throw new IOException("Data-node and name-node CTimes 必须是相同.");
     }
     // 3. 更新成功加载存储。
     setServiceLayoutVersion(getServiceLayoutVersion());
     writeProperties(sd);
     return sd;
   } catch (IOException ioe) {
     sd.unlock();
     throw ioe;
   }
 }
Ejemplo n.º 5
0
  /**
   * Analyze storage directories. Recover from previous transitions if required. Perform fs state
   * transition if necessary depending on the namespace info. Read storage info. <br>
   * This method should be synchronized between multiple DN threads. Only the first DN thread does
   * DN level storage dir recoverTransitionRead.
   *
   * @param nsInfo namespace information
   * @param dataDirs array of data storage directories
   * @param startOpt startup option
   * @throws IOException
   */
  synchronized void recoverTransitionRead(
      DataNode datanode, NamespaceInfo nsInfo, Collection<File> dataDirs, StartupOption startOpt)
      throws IOException {
    if (initilized) {
      // DN storage has been initialized, no need to do anything
      return;
    }
    assert HdfsConstants.LAYOUT_VERSION == nsInfo.getLayoutVersion()
        : "Data-node version "
            + HdfsConstants.LAYOUT_VERSION
            + " and name-node layout version "
            + nsInfo.getLayoutVersion()
            + " must be the same.";

    // 1. For each data directory calculate its state and
    // check whether all is consistent before transitioning.
    // Format and recover.
    this.storageDirs = new ArrayList<StorageDirectory>(dataDirs.size());
    ArrayList<StorageState> dataDirStates = new ArrayList<StorageState>(dataDirs.size());
    for (Iterator<File> it = dataDirs.iterator(); it.hasNext(); ) {
      File dataDir = it.next();
      StorageDirectory sd = new StorageDirectory(dataDir);
      StorageState curState;
      try {
        curState = sd.analyzeStorage(startOpt, this);
        // sd is locked but not opened
        switch (curState) {
          case NORMAL:
            break;
          case NON_EXISTENT:
            // ignore this storage
            LOG.info("Storage directory " + dataDir + " does not exist");
            it.remove();
            continue;
          case NOT_FORMATTED: // format
            LOG.info("Storage directory " + dataDir + " is not formatted");
            LOG.info("Formatting ...");
            format(sd, nsInfo);
            break;
          default: // recovery part is common
            sd.doRecover(curState);
        }
      } catch (IOException ioe) {
        sd.unlock();
        LOG.warn("Ignoring storage directory " + dataDir + " due to an exception", ioe);
        // continue with other good dirs
        continue;
      }
      // add to the storage list
      addStorageDir(sd);
      dataDirStates.add(curState);
    }

    if (dataDirs.size() == 0 || dataDirStates.size() == 0) // none of the data dirs exist
    throw new IOException("All specified directories are not accessible or do not exist.");

    // 2. Do transitions
    // Each storage directory is treated individually.
    // During startup some of them can upgrade or rollback
    // while others could be uptodate for the regular startup.
    for (int idx = 0; idx < getNumStorageDirs(); idx++) {
      doTransition(datanode, getStorageDir(idx), nsInfo, startOpt);
      assert this.getLayoutVersion() == nsInfo.getLayoutVersion()
          : "Data-node and name-node layout versions must be the same.";
    }

    // make sure we have storage id set - if not - generate new one
    createStorageID(datanode.getXferPort());

    // 3. Update all storages. Some of them might have just been formatted.
    this.writeAll();

    // 4. mark DN storage is initilized
    this.initilized = true;
  }