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; }
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)); } } }
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); } } }
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)); } } }
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)); } }