private INodeReference loadINodeReference(INodeReferenceSection.INodeReference r)
     throws IOException {
   long referredId = r.getReferredId();
   INode referred = fsDir.getInode(referredId);
   WithCount withCount = (WithCount) referred.getParentReference();
   if (withCount == null) {
     withCount = new INodeReference.WithCount(null, referred);
   }
   final INodeReference ref;
   if (r.hasDstSnapshotId()) { // DstReference
     ref = new INodeReference.DstReference(null, withCount, r.getDstSnapshotId());
   } else {
     ref =
         new INodeReference.WithName(
             null, withCount, r.getName().toByteArray(), r.getLastSnapshotId());
   }
   return ref;
 }
 /**
  * The sequence of the ref node in refList must be strictly the same with the sequence in
  * fsimage
  */
 public void loadINodeReferenceSection(InputStream in) throws IOException {
   final List<INodeReference> refList = parent.getLoaderContext().getRefList();
   while (true) {
     INodeReferenceSection.INodeReference e =
         INodeReferenceSection.INodeReference.parseDelimitedFrom(in);
     if (e == null) {
       break;
     }
     INodeReference ref = loadINodeReference(e);
     refList.add(ref);
   }
 }
 private INodeReferenceSection.INodeReference.Builder buildINodeReference(INodeReference ref)
     throws IOException {
   INodeReferenceSection.INodeReference.Builder rb =
       INodeReferenceSection.INodeReference.newBuilder().setReferredId(ref.getId());
   if (ref instanceof WithName) {
     rb.setLastSnapshotId(((WithName) ref).getLastSnapshotId())
         .setName(ByteString.copyFrom(ref.getLocalNameBytes()));
   } else if (ref instanceof DstReference) {
     rb.setDstSnapshotId(((DstReference) ref).getDstSnapshotId());
   }
   return rb;
 }