/// <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();
                }
            }
        }
Exemple #2
0
        /// <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);
        }