public void Reuse( ProgressVector progressVector, EndCheckpointLogRecord lastCompletedEndCheckpointRecord, BeginCheckpointLogRecord lastInProgressBeginCheckpointRecord, PhysicalLogRecord lastLinkedPhysicalRecord, InformationLogRecord lastInformationRecord, IndexingLogRecord currentLogHeadRecord, Epoch tailEpoch, LogicalSequenceNumber tailLsn) { this.LastInProgressCheckpointRecord = lastInProgressBeginCheckpointRecord; Utility.Assert(this.LastInProgressCheckpointRecord == null, "ReInitialize of ReplicatedLogManager must have null in progress checkpoint"); this.LastInProgressTruncateHeadRecord = null; this.ProgressVector = progressVector; this.LastCompletedEndCheckpointRecord = lastCompletedEndCheckpointRecord; this.LastLinkedPhysicalRecord = lastLinkedPhysicalRecord; this.CurrentLogHeadRecord = currentLogHeadRecord; this.LastInformationRecord = lastInformationRecord; this.CurrentLogTailEpoch = tailEpoch; this.CurrentLogTailLsn = tailLsn; }
private static LogRecord ReadRecord(BinaryReader br, ulong recordPosition, bool isPhysicalRead) { LogRecord record; var lsn = LogicalSequenceNumber.InvalidLsn.LSN; LogRecordType recordType; // Metadata section. var startingPosition = br.BaseStream.Position; var sizeOfSection = br.ReadInt32(); var endPosition = startingPosition + sizeOfSection; // Read Logical Metadata recordType = (LogRecordType)br.ReadUInt32(); switch (recordType) { case LogRecordType.BeginTransaction: record = new BeginTransactionOperationLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.Operation: record = new OperationLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.EndTransaction: record = new EndTransactionLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.Barrier: record = new BarrierLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.UpdateEpoch: record = new UpdateEpochLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.Backup: record = new BackupLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.BeginCheckpoint: record = new BeginCheckpointLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.EndCheckpoint: record = new EndCheckpointLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.Indexing: record = new IndexingLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.TruncateHead: record = new TruncateHeadLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.TruncateTail: record = new TruncateTailLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.Information: record = new InformationLogRecord(recordType, recordPosition, lsn); break; case LogRecordType.CompleteCheckpoint: record = new CompleteCheckpointLogRecord(recordType, recordPosition, lsn); break; default: Utility.CodingError("Unexpected record type {0}", recordType); return(null); } record.lsn = new LogicalSequenceNumber(br.ReadInt64()); // Jump to the end of the section ignoring fields that are not understood. Utility.Assert(endPosition >= br.BaseStream.Position, "Could not have read more than section size."); br.BaseStream.Position = endPosition; record.Read(br, isPhysicalRead); return(record); }
/// <summary> /// Process the information log record. /// </summary> /// <param name="informationLogRecord">The information log record to be processed.</param> /// <param name="isRecoverableRecord">Is this a recoverable record.</param> private void ProcessLogRecord(InformationLogRecord informationLogRecord, out bool isRecoverableRecord) { isRecoverableRecord = informationLogRecord.IsBarrierRecord; }