Example #1
0
        private void Init()
        {
            IPage headingPage = _pageManager.FetchPage(0);
            var   header      = PageFormatter.GetPageHeader(headingPage) as HeadingPageHeader;

            if (header == null)
            {
                throw new StorageFormatException("Heading page not found");
            }

            _firstFsmPageIndex = header.FsmPageIndex;
            _fsmPageIndexes.Add(_firstFsmPageIndex);

            IPage firstFsmPage = _pageManager.FetchPage(_firstFsmPageIndex);
            var   fsmHeader    = PageFormatter.GetPageHeader(firstFsmPage) as FreeSpaceMapPageHeader;

            if (fsmHeader == null)
            {
                throw new StorageFormatException("Free space map page not found");
            }

            _entryPerPage = PageFormatter.GetFsmEntryCount(firstFsmPage);

            _isInitialized = true;
        }
Example #2
0
        public void OnEmptyStorageAllRequestedPagesShouldBeFull()
        {
            var manager = new FileSystemPageManager(4096);

            using (var storage = new Storage(manager))
            {
                storage.CreateNew(StoragePath);
                var fsm = new FreeSpaceMap(manager);

                int entryCount = PageFormatter.GetFsmEntryCount(manager.FetchPage(1));

                for (int i = 0; i < entryCount; i++)
                {
                    Assert.AreEqual(FsmValue.Full, fsm.Get(i));
                }
            }
        }
Example #3
0
        public void MultiPageOperations()
        {
            var manager = new FileSystemPageManager(4096);

            using (var storage = new Storage(manager))
            {
                storage.CreateNew(StoragePath);
                var fsm = new FreeSpaceMap(manager);

                int entryPerPage = PageFormatter.GetFsmEntryCount(manager.FetchPage(1));
                int entryCount   = entryPerPage * 3;

                // check writing to the last page
                var value = FsmValue.Class0;
                var index = entryCount - 1;
                fsm.Set(index, value);
                Assert.AreEqual(value, fsm.Get(index));

                // middle page
                value = FsmValue.Class1;
                index = entryPerPage + 1;
                fsm.Set(index, value);
                Assert.AreEqual(value, fsm.Get(index));

                // the first page
                value = FsmValue.Class2;
                index = entryPerPage - 1;
                fsm.Set(index, value);
                Assert.AreEqual(value, fsm.Get(index));

                for (int i = 0; i < entryCount; i++)
                {
                    fsm.Set(i, FsmValue.Class3);
                }

                for (int i = 0; i < entryCount; i++)
                {
                    long pageIndex = fsm.GetFreePageIndex(FsmValue.Class3);
                    Assert.AreNotEqual(-1, pageIndex);
                    fsm.Set(i, FsmValue.Full);
                }
            }
        }
Example #4
0
        public void SinglePageOperations()
        {
            var manager = new FileSystemPageManager(4096);

            using (var storage = new Storage(manager))
            {
                storage.CreateNew(StoragePath);
                var fsm = new FreeSpaceMap(manager);

                var r          = new Random();
                int entryCount = PageFormatter.GetFsmEntryCount(manager.FetchPage(1));

                for (int i = 0; i < 100000; i++)
                {
                    var value = (FsmValue)r.Next((int)FsmValue.Max);
                    var index = r.Next(entryCount);
                    fsm.Set(index, value);

                    Assert.AreEqual(value, fsm.Get(index));
                }
            }
        }
Example #5
0
        public void FsmPage()
        {
            int pageSize         = 32768;
            var dummyPageManager = new FileSystemPageManager(pageSize);
            var p = new Page(dummyPageManager, 0, new byte[pageSize]);

            var fsmh = new FreeSpaceMapPageHeader();
            var r    = new Random();

            PageFormatter.InitPage(p, fsmh);
            int fsmEntryCount = PageFormatter.GetFsmEntryCount(p);

            // set all values to "full"
            PageFormatter.SetAllFsmValues(p, FsmValue.Full);

            // check if all values are actually "full"
            for (int i = 0; i < fsmEntryCount; i++)
            {
                Assert.AreEqual(FsmValue.Full, PageFormatter.GetFsmValue(p, i));
            }

            var values = new FsmValue[fsmEntryCount];

            // set and keep random values
            for (int i = 0; i < fsmEntryCount; i++)
            {
                var value = (byte)r.Next((byte)FsmValue.Full + 1);
                PageFormatter.SetFsmValue(p, i, (FsmValue)value);
                values[i] = (FsmValue)value;
            }

            // compare it
            for (int i = 0; i < fsmEntryCount; i++)
            {
                Assert.AreEqual(values[i], PageFormatter.GetFsmValue(p, i));
            }
        }