// do not store locations of last block /// <summary> /// Serialize a /// <see cref="INodeFile"/> /// node /// </summary> /// <param name="node">The node to write</param> /// <param name="out"> /// The /// <see cref="System.IO.DataOutputStream"/> /// where the fields are written /// </param> /// <param name="writeBlock">Whether to write block information</param> /// <exception cref="System.IO.IOException"/> public static void WriteINodeFile(INodeFile file, DataOutput @out, bool writeUnderConstruction ) { WriteLocalName(file, @out); @out.WriteLong(file.GetId()); @out.WriteShort(file.GetFileReplication()); @out.WriteLong(file.GetModificationTime()); @out.WriteLong(file.GetAccessTime()); @out.WriteLong(file.GetPreferredBlockSize()); WriteBlocks(file.GetBlocks(), @out); SnapshotFSImageFormat.SaveFileDiffList(file, @out); if (writeUnderConstruction) { if (file.IsUnderConstruction()) { @out.WriteBoolean(true); FileUnderConstructionFeature uc = file.GetFileUnderConstructionFeature(); WriteString(uc.GetClientName(), @out); WriteString(uc.GetClientMachine(), @out); } else { @out.WriteBoolean(false); } } WritePermissionStatus(file, @out); }
// Helper function that writes an INodeUnderConstruction // into the output stream // /// <exception cref="System.IO.IOException"/> internal static void WriteINodeUnderConstruction(DataOutputStream @out, INodeFile cons, string path) { WriteString(path, @out); @out.WriteLong(cons.GetId()); @out.WriteShort(cons.GetFileReplication()); @out.WriteLong(cons.GetModificationTime()); @out.WriteLong(cons.GetPreferredBlockSize()); WriteBlocks(cons.GetBlocks(), @out); cons.GetPermissionStatus().Write(@out); FileUnderConstructionFeature uc = cons.GetFileUnderConstructionFeature(); WriteString(uc.GetClientName(), @out); WriteString(uc.GetClientMachine(), @out); @out.WriteInt(0); }
/// <exception cref="System.IO.IOException"/> internal void SerializeFilesUCSection(OutputStream @out) { IDictionary <string, INodeFile> ucMap = fsn.GetFilesUnderConstruction(); foreach (KeyValuePair <string, INodeFile> entry in ucMap) { string path = entry.Key; INodeFile file = entry.Value; FsImageProto.FilesUnderConstructionSection.FileUnderConstructionEntry.Builder b = FsImageProto.FilesUnderConstructionSection.FileUnderConstructionEntry.NewBuilder ().SetInodeId(file.GetId()).SetFullPath(path); FsImageProto.FilesUnderConstructionSection.FileUnderConstructionEntry e = ((FsImageProto.FilesUnderConstructionSection.FileUnderConstructionEntry )b.Build()); e.WriteDelimitedTo(@out); } parent.CommitSection(summary, FSImageFormatProtobuf.SectionName.FilesUnderconstruction ); }
public virtual void TestCommitWithInvalidGenStamp() { Path file = new Path("/file"); FSDataOutputStream @out = null; try { @out = dfs.Create(file, (short)1); INodeFile fileNode = dir.GetINode4Write(file.ToString()).AsFile(); ExtendedBlock previous = null; Block newBlock = DFSTestUtil.AddBlockToFile(cluster.GetDataNodes(), dfs, cluster. GetNamesystem(), file.ToString(), fileNode, dfs.GetClient().GetClientName(), previous , 100); Block newBlockClone = new Block(newBlock); previous = new ExtendedBlock(cluster.GetNamesystem().GetBlockPoolId(), newBlockClone ); previous.SetGenerationStamp(123); try { dfs.GetClient().GetNamenode().Complete(file.ToString(), dfs.GetClient().GetClientName (), previous, fileNode.GetId()); NUnit.Framework.Assert.Fail("should throw exception because invalid genStamp"); } catch (IOException e) { NUnit.Framework.Assert.IsTrue(e.ToString().Contains("Commit block with mismatching GS. NN has " + newBlock + ", client submits " + newBlockClone)); } previous = new ExtendedBlock(cluster.GetNamesystem().GetBlockPoolId(), newBlock); bool complete = dfs.GetClient().GetNamenode().Complete(file.ToString(), dfs.GetClient ().GetClientName(), previous, fileNode.GetId()); NUnit.Framework.Assert.IsTrue("should complete successfully", complete); } finally { IOUtils.Cleanup(null, @out); } }