code: void recoverTransitionRead(DataNode datanode, int namespaceId, NamespaceInfo nsInfo,
        Collection<File> dataDirs, StartupOption startOpt, String nameserviceId) throws IOException {
      // First ensure datanode level format/snapshot/rollback is completed
      // recoverTransitionRead(datanode, nsInfo, dataDirs, startOpt);
      
      // Create list of storage directories for the Name Space
      Collection<File> nsDataDirs = new ArrayList<File>();
      for(Iterator<File> it = dataDirs.iterator(); it.hasNext();) {
        File dnRoot = it.next();
        File nsRoot = NameSpaceSliceStorage.getNsRoot(
            namespaceId, new File(dnRoot, STORAGE_DIR_CURRENT));
        nsDataDirs.add(nsRoot);
      }
      boolean merged = false;
      String[] mergeDataDirs = nameserviceId == null? null: 
        datanode.getConf().getStrings("dfs.merge.data.dir." + nameserviceId);
      if (startOpt.equals(StartupOption.REGULAR) && mergeDataDirs != null
          && mergeDataDirs.length > 0) {
        assert mergeDataDirs.length == dataDirs.size();
        merged = doMerge(mergeDataDirs, nsDataDirs, namespaceId, nsInfo, startOpt);
      }
      if (!merged) {
        // mkdir for the list of NameSpaceStorage
        makeNameSpaceDataDir(nsDataDirs);
      }
      NameSpaceSliceStorage nsStorage = new NameSpaceSliceStorage(
          namespaceId, this.getCTime(), layoutMap);
      
      nsStorage.recoverTransitionRead(datanode, nsInfo, nsDataDirs, startOpt);
      addNameSpaceStorage(namespaceId, nsStorage);
    }
docs: recoverTransitionRead for a specific Name Space
  
  @param datanode DataNode
  @param namespaceId name space Id
  @param nsInfo Namespace info of namenode corresponding to the Name Space
  @param dataDirs Storage directories
  @param startOpt startup option
  @throws IOException on error