Example #1
0
        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);
        }
Example #2
0
        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 ");
        }
Example #3
0
        static bool IsValidBlock(PersistentBlock block)
        {
            if (block.BeginMarker != PersistentBlock.BeginMarkerValue)
            {
                return(false);
            }

            if (block.EndMarker != PersistentBlock.EndMarkerValue)
            {
                return(false);
            }


            return(block.HashOk);
        }