Esempio n. 1
0
        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]);
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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]);
        }
Esempio n. 5
0
        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]);
        }