private void doUpgrade(List<StorageDirectory> sds,
                 List<StorageInfo> sdsInfo,
                 final NamespaceInfo nsInfo
                 ) throws IOException {
    assert sds.size() == sdsInfo.size();
    UpgradeThread[] upgradeThreads = new UpgradeThread[sds.size()];
    // start to upgrade
    for (int i=0; i<upgradeThreads.length; i++) {
      final StorageDirectory sd = sds.get(i);
      final StorageInfo si = sdsInfo.get(i);
      UpgradeThread thread = new UpgradeThread(sd, si, nsInfo);
      thread.start();
      upgradeThreads[i] = thread;
    }
    // wait for upgrade to be done
    for (UpgradeThread thread : upgradeThreads) {
      try {
        thread.join();
      } catch (InterruptedException e) {
        throw (InterruptedIOException)new InterruptedIOException().initCause(e);
      }
    }
    // check for errors
    for (UpgradeThread thread : upgradeThreads) {
      if (thread.error != null)
        throw new IOException(thread.error);
    }

    // write version file
    this.layoutVersion = FSConstants.LAYOUT_VERSION;
    assert this.namespaceID == nsInfo.getNamespaceID() :
      "Data-node and name-node layout versions must be the same.";
    this.cTime = nsInfo.getCTime();
    for (StorageDirectory sd :sds) {
      sd.write();
      File prevDir = sd.getPreviousDir();
      File tmpDir = sd.getPreviousTmp();
      // rename tmp to previous
      rename(tmpDir, prevDir);
      LOG.info("Upgrade of " + sd.getRoot()+ " is complete.");
    }
  }
private void doUpgrade ( List < StorageDirectory > sds , List < StorageInfo > sdsInfo , final NamespaceInfo nsInfo ) throws IOException { assert sds . size ( ) == sdsInfo . size ( ) ; UpgradeThread [ ] upgradeThreads = new UpgradeThread [ sds . size ( ) ] ; for ( int i = 0 ; i < upgradeThreads . length ; i ++ ) { final StorageDirectory sd = sds . get ( i ) ; final StorageInfo si = sdsInfo . get ( i ) ; UpgradeThread thread = new UpgradeThread ( sd , si , nsInfo ) ; thread . start ( ) ; upgradeThreads [ i ] = thread ; } for ( UpgradeThread thread : upgradeThreads ) { try { thread . join ( ) ; } catch ( InterruptedException e ) { throw ( InterruptedIOException ) new InterruptedIOException ( ) . initCause ( e ) ; } } for ( UpgradeThread thread : upgradeThreads ) { if ( thread . error != null ) throw new IOException ( thread . error ) ; } this . layoutVersion = FSConstants . LAYOUT_VERSION ; assert this . namespaceID == nsInfo . getNamespaceID ( ) : "Data-node and name-node layout versions must be the same." ; this . cTime = nsInfo . getCTime ( ) ; for ( StorageDirectory sd : sds ) { sd . write ( ) ; File prevDir = sd . getPreviousDir ( ) ; File tmpDir = sd . getPreviousTmp ( ) ; rename ( tmpDir , prevDir ) ; LOG . info ( "Upgrade of " + sd . getRoot ( ) + " is complete." ) ; } }
Move current storage into a backup directory,
and hardlink all its blocks into the new current directory.