/// <summary> /// /// </summary> /// <remarks>Exposed for testability.</remarks> internal static async Task PopulateMetadataAsync(MetadataTable metadataTable, Stream stream, string traceType) { // Read and validate the Footer section. The footer is always at the end of the stream, minus space for the checksum. var footerHandle = new BlockHandle(stream.Length - FileFooter.SerializedSize - sizeof(ulong), FileFooter.SerializedSize); var footer = await FileBlock.ReadBlockAsync(stream, footerHandle, (sectionReader, sectionHandle) => FileFooter.Read(sectionReader, sectionHandle)).ConfigureAwait(false); // Verify we know how to deserialize this version of the file. if (footer.Version != FileVersion) { throw new InvalidDataException(SR.Error_MetadataManager_Deserialized); } // Read and validate the Properties section. var propertiesHandle = footer.PropertiesHandle; var properties = await FileBlock.ReadBlockAsync( stream, propertiesHandle, (sectionReader, sectionHandle) => FilePropertySection.Read <MetadataManagerFileProperties>(sectionReader, sectionHandle)).ConfigureAwait(false); // Read disk metadata into memory. await ReadDiskMetadataAsync(metadataTable.Table, stream, properties, traceType).ConfigureAwait(false); metadataTable.CheckpointLSN = properties.CheckpointLSN; }
/// <summary> /// Deserializes the metadata (footer, properties, etc.) for this checkpoint file. /// </summary> private async Task ReadMetadataAsync() { Stream filestream = null; try { filestream = this.ReaderPool.AcquireStream(); // Read and validate the Footer section. The footer is always at the end of the stream, minus space for the checksum. var footerHandle = new BlockHandle(filestream.Length - FileFooter.SerializedSize - sizeof(ulong), FileFooter.SerializedSize); this.Footer = await FileBlock.ReadBlockAsync(filestream, footerHandle, (sectionReader, sectionHandle) => FileFooter.Read(sectionReader, sectionHandle)).ConfigureAwait(false); // Verify we know how to deserialize this version of the checkpoint file. if (this.Footer.Version != FileVersion) { throw new InvalidDataException(SR.Error_KeyCheckpointFile_Deserialized); } // Read and validate the Properties section. var propertiesHandle = this.Footer.PropertiesHandle; this.Properties = await FileBlock.ReadBlockAsync( filestream, propertiesHandle, (sectionReader, sectionHandle) => FilePropertySection.Read <KeyCheckpointFileProperties>(sectionReader, sectionHandle)).ConfigureAwait(false); } finally { this.ReaderPool.ReleaseStream(filestream, true); } }
/// <summary> /// Deserializes the metadata (footer, properties, etc.) for this checkpoint file. /// </summary> private async Task ReadMetadataAsync() { Stream filestream = null; try { filestream = this.ReaderPool.AcquireStream(); var snapFileStream = filestream as FileStream; Diagnostics.Assert(snapFileStream != null, this.traceType, "fileStream must be a FileStream"); Microsoft.ServiceFabric.Replicator.Utility.SetIoPriorityHint(snapFileStream.SafeFileHandle, this.priorityHint); // Read and validate the Footer section. The footer is always at the end of the stream, minus space for the checksum. var footerHandle = new BlockHandle(filestream.Length - FileFooter.SerializedSize - sizeof(ulong), FileFooter.SerializedSize); this.Footer = await FileBlock.ReadBlockAsync(filestream, footerHandle, (sectionReader, sectionHandle) => FileFooter.Read(sectionReader, sectionHandle)).ConfigureAwait(false); // Verify we know how to deserialize this version of the checkpoint file. if (this.Footer.Version != FileVersion) { throw new InvalidDataException(SR.Error_ValueCheckpoint_Deserialized); } // Read and validate the Properties section. var propertiesHandle = this.Footer.PropertiesHandle; this.Properties = await FileBlock.ReadBlockAsync( filestream, propertiesHandle, (sectionReader, sectionHandle) => FilePropertySection.Read <ValueCheckpointFileProperties>(sectionReader, sectionHandle)).ConfigureAwait(false); } finally { this.ReaderPool.ReleaseStream(filestream, true); } }
internal static async Task ValidateAsync(string path, string traceType) { // MCoskun: Open of metadata file's IO priority is not set. // Reason: USed during CompleteCheckpoint which can block copy and backup. using (var stream = FabricFile.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous)) { // Read and validate the Footer section. The footer is always at the end of the stream, minus space for the checksum. var footerHandle = new BlockHandle(stream.Length - FileFooter.SerializedSize - sizeof(ulong), FileFooter.SerializedSize); var footer = await FileBlock.ReadBlockAsync(stream, footerHandle, (sectionReader, sectionHandle) => FileFooter.Read(sectionReader, sectionHandle)).ConfigureAwait(false); // Verify we know how to deserialize this version of the file. if (footer.Version != FileVersion) { throw new InvalidDataException(SR.Error_MetadataManager_Deserialized); } // Read and validate the Properties section. var propertiesHandle = footer.PropertiesHandle; var properties = await FileBlock.ReadBlockAsync( stream, propertiesHandle, (sectionReader, sectionHandle) => FilePropertySection.Read <MetadataManagerFileProperties>(sectionReader, sectionHandle)).ConfigureAwait(false); } }