/// <summary> /// Open an existing <see cref="StateManagerFile"/> from the given file path. /// </summary> /// <param name="filePath">Path to the checkpoint file.</param> /// <param name="traceType">Tracing information.</param> /// <param name="deserializeTypes">Should the type information be deserialized.</param> /// <param name="cancellationToken">Token used to signal cancellation.</param> /// <returns>The opened <see cref="StateManagerFile"/>.</returns> internal static async Task <StateManagerFile> OpenAsync( string filePath, string traceType, bool deserializeTypes, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(filePath)) { throw new ArgumentException(SR.Error_FilePath_Null_NoArgs); } if (!FabricFile.Exists(filePath)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Error_FilePath_Null, filePath)); } // Open the file with asynchronous flag and 4096 cache size (C# default). // MCoskun: Default IoPriorityHint is used. // Reason: Used during open, restore and complete checkpoint. using (var filestream = FabricFile.Open( filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous)) { var stateManagerFile = new StateManagerFile(filePath); // 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); stateManagerFile.footer = await FileBlock.ReadBlockAsync( filestream, footerHandle, (reader, handle) => FileFooter.Read(reader, handle)).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); // Verify we know how to deserialize this version of the state manager checkpoint file. if (stateManagerFile.footer.Version != Version) { throw new InvalidDataException( string.Format( CultureInfo.CurrentCulture, "StateManager checkpoint file cannot be deserialized (unknown version number: {0}, expected version number: {1})", stateManagerFile.footer.Version, Version)); } // Read and validate the properties section. var propertiesHandle = stateManagerFile.footer.PropertiesHandle; stateManagerFile.properties = await FileBlock.ReadBlockAsync( filestream, propertiesHandle, (reader, handle) => FileProperties.Read <StateManagerFileProperties>(reader, handle)).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); // Read the state provider metadata. stateManagerFile.StateProviderMetadata = await stateManagerFile.ReadMetadataAsync(filestream, traceType, deserializeTypes, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); stateManagerFile.FileSize = filestream.Length; return(stateManagerFile); } }
/// <summary> /// Open an existing <see cref="BackupLogFile"/> from the given file path. /// </summary> /// <param name="fileName">Path to the backup log file.</param> /// <param name="cancellationToken">Token used to signal cancellation.</param> /// <returns>The opened <see cref="BackupLogFile"/>.</returns> public static async Task <BackupLogFile> OpenAsync(string fileName, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException(SR.Error_FilePath_Null_NoArgs); } if (!FabricFile.Exists(fileName)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Error_FilePath_Null, fileName)); } // Open the file with asynchronous flag and 4096 cache size (C# default). // MCoskun: Uses default IOPriorityHint since this operation is called during Restore. using (var filestream = FabricFile.Open( fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous)) { var backupLogFile = new BackupLogFile(fileName); backupLogFile.Size = filestream.Length; // 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); backupLogFile.footer = await FileBlock.ReadBlockAsync( filestream, footerHandle, (reader, handle) => FileFooter.Read(reader, handle)).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); // Verify we know how to deserialize this version of the backup log file. if (backupLogFile.footer.Version != Version) { throw new InvalidDataException( string.Format( CultureInfo.CurrentCulture, SR.Error_BackupLogFile_Deserialized, backupLogFile.footer.Version, Version)); } // Read and validate the properties section. var propertiesHandle = backupLogFile.footer.PropertiesHandle; backupLogFile.properties = await FileBlock.ReadBlockAsync( filestream, propertiesHandle, (reader, handle) => FileProperties.Read <BackupLogFileProperties>(reader, handle)).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); return(backupLogFile); } }