public void CanRecover() { _recoveryManager = new RecoveryManager(_bufferManager, _logManager, 6); var block = new Block(RandomFilename, 0); var buffer = _bufferManager.Pin(block); _recoveryManager.Recover(); _bufferManager.Unpin(buffer); _bufferManager.FlushAll(6); var page = _fileManager.ResolvePage(); _ = page.Read(new Block(_name, 0)); var enumerator = _logManager.GetEnumerator(); var record = enumerator.Current; var checkpointRecord = new CheckpointRecord(_logManager, _bufferManager, record); Assert.AreEqual(LogRecordType.Checkpoint, checkpointRecord.Type); Assert.AreEqual(1, checkpointRecord.Transactions.Length); Assert.AreEqual(6, checkpointRecord.Transactions[0]); }
public void Recover() { _bufferManager.FlushAll(_transactionNumber); DoRecover(); // TODO: need to somehow fetch all current transactions and write them var lsn = new CheckpointRecord(_logManager, _bufferManager, new int[] { _transactionNumber }) .WriteToLog(); _logManager.Flush(lsn); }
public void CanReadCheckpointRecord() { var rec = new CheckpointRecord(_logManager, _bufferManager, new int[] { 5, 8, 9 }); var lsn = rec.WriteToLog(); _logManager.Flush(lsn); _enumerator = new LogRecordEnumerator(_logManager, _bufferManager); var record = _enumerator.Current as CheckpointRecord; Assert.AreEqual(LogRecordType.Checkpoint, record.Type); Assert.AreEqual(new int[] { 5, 8, 9 }, record.Transactions); }
public void CanWriteMultipleCheckpointRecordsToLog() { _logRecord = new CheckpointRecord(_logManager, _bufferManager, new int[] { 1 }); var lsn = _logRecord.WriteToLog(); var lsn2 = new CheckpointRecord(_logManager, _bufferManager, new int[] { 2, 3 }).WriteToLog(); _logManager.Flush(lsn2); var page = _fileManager.ResolvePage(); _ = page.Read(new Block(_logFileName, 0)); _ = page.GetInt(0, out var _); _ = page.GetInt(4, out var recordType1); _ = page.GetInt(8, out var totalLength1); var items1 = new int[totalLength1]; for (int i = 0; i < totalLength1; ++i) { _ = page.GetInt(12 + i * 4, out items1[i]); } _ = page.GetInt(20, out var recordType2); _ = page.GetInt(24, out var totalLength2); var items2 = new int[totalLength2]; for (int i = 0; i < totalLength2; ++i) { _ = page.GetInt(28 + i * 4, out items2[i]); } Assert.AreEqual(0, lsn); Assert.AreEqual((int)LogRecordType.Checkpoint, recordType1); Assert.AreEqual(1, totalLength1); Assert.AreEqual(1, items1.Length); Assert.AreEqual(1, items1[0]); Assert.AreEqual(1, lsn2); Assert.AreEqual((int)LogRecordType.Checkpoint, recordType2); Assert.AreEqual(2, totalLength2); Assert.AreEqual(2, items2.Length); Assert.AreEqual(2, items2[0]); Assert.AreEqual(3, items2[1]); }
public void CanReadBackwardsFromLog() { _logRecord = new CheckpointRecord(_logManager, _bufferManager, new int[] { 1, 2, 3 }); var lsn = _logRecord.WriteToLog(); _logManager.Flush(lsn); var enumerator = _logManager.GetEnumerator(); var basicLogRecord = enumerator.Current; var logRecord = new CheckpointRecord(_logManager, _bufferManager, basicLogRecord); Assert.AreEqual(LogRecordType.Checkpoint, logRecord.Type); Assert.AreEqual(3, logRecord.Transactions.Length); Assert.AreEqual(1, logRecord.Transactions[0]); Assert.AreEqual(2, logRecord.Transactions[1]); Assert.AreEqual(3, logRecord.Transactions[2]); }