/// <summary> /// Recover the state. /// </summary> /// <returns></returns> public async Task RecoveryAsync(CancellationToken cancellationToken) { Diagnostics.Assert(metadataTable != null, this.traceType, "metadataTable cannot be null"); Diagnostics.Assert(metadataTable.Table != null, this.traceType, "metadataTable.Table cannot be null"); List <KeyCheckpointFileAsyncEnumerator <TKey, TValue> > keyCheckpointFileList = new List <KeyCheckpointFileAsyncEnumerator <TKey, TValue> >(this.metadataTable.Table.Count); try { foreach (var item in this.metadataTable.Table) { var fileMetadata = item.Value; Diagnostics.Assert(fileMetadata.CanBeDeleted == false, this.traceType, "fileMetadata.CanBeDeleted == false"); // Set file id. if (fileMetadata.FileId > this.fileId) { this.fileId = fileMetadata.FileId; } // Set file timestamp. if (fileMetadata.TimeStamp > this.logicalCheckpointFileTimeStamp) { this.logicalCheckpointFileTimeStamp = fileMetadata.TimeStamp; } var fileName = Path.Combine(this.workDirectory, fileMetadata.FileName); fileMetadata.CheckpointFile = await CheckpointFile.OpenAsync(fileName, this.traceType, this.isValueReferenceType).ConfigureAwait(false); // MCoskun: Checkpoint recoveries IO priority is not set. // Reason: We do not know whether this replica's recovery is required for write quorum. keyCheckpointFileList.Add(fileMetadata.CheckpointFile.GetAsyncEnumerator <TKey, TValue>(this.keyConverter, this.traceType)); #if !DotNetCoreClr FabricEvents.Events.CheckpointFileMetadata(this.traceType, DifferentialStoreConstants.Recovery_MergeSelected, fileMetadata.FileName, fileMetadata.FileId, fileMetadata.TotalNumberOfEntries, fileMetadata.NumberOfDeletedEntries, fileMetadata.NumberOfInvalidEntries); #endif // reset invalid count as it may contain incorrect value fileMetadata.ResetInvalidCount(); } await this.MergeAsync(keyCheckpointFileList, cancellationToken); } finally { foreach (var keyCheckpointFile in keyCheckpointFileList) { keyCheckpointFile.Dispose(); } } }
/// <summary>Return a list of checkpoint files</summary> /// <param name="name">Name of checkpoint</param> public IEnumerable <CheckpointFile> GetCheckpointFiles(string name) { List <CheckpointFile> files = new List <CheckpointFile>(); int checkpointID = GetCheckpointID(name); if (checkpointID != -1) { DataTable data = connection.ExecuteQuery("SELECT * FROM _CheckpointFiles WHERE CheckpointID = " + checkpointID); foreach (DataRow row in data.Rows) { CheckpointFile file = new CheckpointFile(); file.fileName = row["FileName"] as string; file.contents = row["Contents"] as byte[]; files.Add(file); } } return(files); }