/// <summary>Save one inode's attributes to the image.</summary> /// <exception cref="System.IO.IOException"/> public static void SaveINode2Image(INode node, DataOutput @out, bool writeUnderConstruction , SnapshotFSImageFormat.ReferenceMap referenceMap) { if (node.IsReference()) { WriteINodeReference(node.AsReference(), @out, writeUnderConstruction, referenceMap ); } else { if (node.IsDirectory()) { WriteINodeDirectory(node.AsDirectory(), @out); } else { if (node.IsSymlink()) { WriteINodeSymlink(node.AsSymlink(), @out); } else { if (node.IsFile()) { WriteINodeFile(node.AsFile(), @out, writeUnderConstruction); } } } } }
/// <summary> /// Serialize a /// <see cref="INodeReference"/> /// node /// </summary> /// <exception cref="System.IO.IOException"/> private static void WriteINodeReference(INodeReference @ref, DataOutput @out, bool writeUnderConstruction, SnapshotFSImageFormat.ReferenceMap referenceMap) { WriteLocalName(@ref, @out); @out.WriteLong(@ref.GetId()); @out.WriteShort(0); // replication @out.WriteLong(0); // modification time @out.WriteLong(0); // access time @out.WriteLong(0); // preferred block size @out.WriteInt(-3); // # of blocks bool isWithName = @ref is INodeReference.WithName; @out.WriteBoolean(isWithName); if (!isWithName) { Preconditions.CheckState(@ref is INodeReference.DstReference); // dst snapshot id @out.WriteInt(((INodeReference.DstReference)@ref).GetDstSnapshotId()); } else { @out.WriteInt(((INodeReference.WithName)@ref).GetLastSnapshotId()); } INodeReference.WithCount withCount = (INodeReference.WithCount)@ref.GetReferredINode (); referenceMap.WriteINodeReferenceWithCount(withCount, @out, writeUnderConstruction ); }