private static StorageReport AnalyzeStorage(string dir) { var fullPath = Path.Combine(dir, ReliableStorage.StorageFileName); using var storage = new FileStream(fullPath, FileMode.Open); storage.Seek(0, SeekOrigin.Begin); var block = new PersistentBlock(); var reader = new BinaryReader(storage); var storageReport = new StorageReport(); // read all the blocks while (block.Read(reader, true)) { storageReport.TotalBlocks++; if (!IsValidBlock(block)) { storageReport.BlocksWithIssues.Add(block); storageReport.InvalidBlocks++; } if (block.BlockStatus == BlockStatus.Active) { storageReport.ActiveBlocks++; } if (block.BlockStatus == BlockStatus.Deleted) { storageReport.DeletedBlocks++; } if (block.BlockStatus == BlockStatus.Dirty) { storageReport.DirtyBlocks++; } if (!IsValidBlock(block)) { FindNextBeginMarker(storage.Position + PersistentBlock.MinSize, storage); } // get the most recent transaction committed to this storage if (block.LastTransactionId > storageReport.LastTransactionId) { storageReport.LastTransactionId = block.LastTransactionId; } storageReport.LastPrimaryKey = block.PrimaryKey; block = new PersistentBlock(); } storageReport.Size = storage.Position; return(storageReport); }
public void Size_of_smallest_dirty_block() { var block = PersistentBlock.MakeDirtyBlock(35); MemoryStream stream = new MemoryStream(); var w = new BinaryWriter(stream); block.Write(w); Console.WriteLine("min size is " + stream.Position); Assert.AreEqual(35, stream.Position, "smallest block size changed (was 35). Code must be updated: PersistentBlock.MinSize constant "); }
static bool IsValidBlock(PersistentBlock block) { if (block.BeginMarker != PersistentBlock.BeginMarkerValue) { return(false); } if (block.EndMarker != PersistentBlock.EndMarkerValue) { return(false); } return(block.HashOk); }