private void loadSnapshots(InputStream in, int size) throws IOException {
   for (int i = 0; i < size; i++) {
     SnapshotSection.Snapshot pbs = SnapshotSection.Snapshot.parseDelimitedFrom(in);
     INodeDirectory root = loadINodeDirectory(pbs.getRoot(), parent.getLoaderContext());
     int sid = pbs.getSnapshotId();
     INodeDirectorySnapshottable parent =
         (INodeDirectorySnapshottable) fsDir.getInode(root.getId()).asDirectory();
     Snapshot snapshot = new Snapshot(sid, root, parent);
     // add the snapshot to parent, since we follow the sequence of
     // snapshotsByNames when saving, we do not need to sort when loading
     parent.addSnapshot(snapshot);
     snapshotMap.put(sid, snapshot);
   }
 }
 /**
  * Load the snapshots section from fsimage. Also convert snapshottable directories into {@link
  * INodeDirectorySnapshottable}.
  */
 public void loadSnapshotSection(InputStream in) throws IOException {
   SnapshotManager sm = fsn.getSnapshotManager();
   SnapshotSection section = SnapshotSection.parseDelimitedFrom(in);
   int snum = section.getNumSnapshots();
   sm.setNumSnapshots(snum);
   sm.setSnapshotCounter(section.getSnapshotCounter());
   for (long sdirId : section.getSnapshottableDirList()) {
     INodeDirectory dir = fsDir.getInode(sdirId).asDirectory();
     final INodeDirectorySnapshottable sdir;
     if (!dir.isSnapshottable()) {
       sdir = new INodeDirectorySnapshottable(dir);
       fsDir.addToInodeMap(sdir);
     } else {
       // dir is root, and admin set root to snapshottable before
       sdir = (INodeDirectorySnapshottable) dir;
       sdir.setSnapshotQuota(INodeDirectorySnapshottable.SNAPSHOT_LIMIT);
     }
     sm.addSnapshottable(sdir);
   }
   loadSnapshots(in, snum);
 }
    /** save all the snapshottable directories and snapshots to fsimage */
    public void serializeSnapshotSection(OutputStream out) throws IOException {
      SnapshotManager sm = fsn.getSnapshotManager();
      SnapshotSection.Builder b =
          SnapshotSection.newBuilder()
              .setSnapshotCounter(sm.getSnapshotCounter())
              .setNumSnapshots(sm.getNumSnapshots());

      INodeDirectorySnapshottable[] snapshottables = sm.getSnapshottableDirs();
      for (INodeDirectorySnapshottable sdir : snapshottables) {
        b.addSnapshottableDir(sdir.getId());
      }
      b.build().writeDelimitedTo(out);
      int i = 0;
      for (INodeDirectorySnapshottable sdir : snapshottables) {
        for (Snapshot s : sdir.getSnapshotsByNames()) {
          Root sroot = s.getRoot();
          SnapshotSection.Snapshot.Builder sb =
              SnapshotSection.Snapshot.newBuilder().setSnapshotId(s.getId());
          INodeSection.INodeDirectory.Builder db =
              buildINodeDirectory(sroot, parent.getSaverContext());
          INodeSection.INode r =
              INodeSection.INode.newBuilder()
                  .setId(sroot.getId())
                  .setType(INodeSection.INode.Type.DIRECTORY)
                  .setName(ByteString.copyFrom(sroot.getLocalNameBytes()))
                  .setDirectory(db)
                  .build();
          sb.setRoot(r).build().writeDelimitedTo(out);
          i++;
          if (i % FSImageFormatProtobuf.Saver.CHECK_CANCEL_INTERVAL == 0) {
            context.checkCancelled();
          }
        }
      }
      Preconditions.checkState(i == sm.getNumSnapshots());
      parent.commitSection(headers, FSImageFormatProtobuf.SectionName.SNAPSHOT);
    }
 /**
  * Generate a {@link SnapshotDiffReport} based on detailed diff information.
  *
  * @return A {@link SnapshotDiffReport} describing the difference
  */
 public SnapshotDiffReport generateReport() {
   List<DiffReportEntry> diffReportList = new ArrayList<DiffReportEntry>();
   for (INode node : diffMap.keySet()) {
     diffReportList.add(new DiffReportEntry(DiffType.MODIFY, diffMap.get(node)));
     if (node.isDirectory()) {
       ChildrenDiff dirDiff = dirDiffMap.get(node);
       List<DiffReportEntry> subList =
           dirDiff.generateReport(
               diffMap.get(node), (INodeDirectoryWithSnapshot) node, isFromEarlier());
       diffReportList.addAll(subList);
     }
   }
   return new SnapshotDiffReport(
       snapshotRoot.getFullPathName(),
       Snapshot.getSnapshotName(from),
       Snapshot.getSnapshotName(to),
       diffReportList);
 }