internal void ReadManifestContents(BinaryReader reader) { int num_versions = reader.Read7BitEncodedInt(); for (int i = 0; i < num_versions; i++) { _versions [i] = reader.Read7BitEncodedInt(); } int num_pages = reader.Read7BitEncodedInt(); for (int j = 0; j < num_pages; j++) { int num_page_entries = reader.Read7BitEncodedInt(); for (int k = 0; k < num_page_entries; k++) { int level = reader.Read7BitEncodedInt(); int version = reader.Read7BitEncodedInt(); int num_key_bytes = reader.Read7BitEncodedInt(); Key startkey = Key.FromBytes(reader.ReadBytes(num_key_bytes)); num_key_bytes = reader.Read7BitEncodedInt(); Key endkey = Key.FromBytes(reader.ReadBytes(num_key_bytes)); var page = new PageRecord(level, version, startkey, endkey); page.AddRef(); _pages [j].Add(page); } } for (int k = 0; k < num_pages; k++) { int num_key_bytes = reader.Read7BitEncodedInt(); _mergeKeys [k] = Key.FromBytes(reader.ReadBytes(num_key_bytes)); } }
public void NotifyPageReleased(PageRecord pageRec) { string path = Config.SortedBlockTableFile(BaseFileName, pageRec.Level, pageRec.Version); if (File.Exists(path)) { File.Delete(path); } }
public ManifestImmutable AddPage(int level, int version, Key firstKey, Key lastKey) // Atomically add page specifications to the manifest. { if (level >= MaxLevels) { throw new IndexOutOfRangeException(); } var page = new PageRecord(level, version, firstKey, lastKey); page.AddRef(); var m = Clone(); m._pages [level].Add(page); m._pages [level].Sort((x, y) => x.FirstKey.CompareTo(y.FirstKey)); return(m); }
public ManifestImmutable NextMergePage(int level, out PageRecord page) { if (level >= MaxLevels) { throw new IndexOutOfRangeException(); } var m = Clone(); var currentKey = _mergeKeys [level]; var levelKeys = _pages [level].Select(key => key.FirstKey).ToList(); int pageNum = levelKeys.BinarySearch(currentKey); if (pageNum < 0) { pageNum = ~pageNum - 1; } pageNum = Math.Max(0, pageNum); int nextPage = pageNum >= levelKeys.Count - 1 ? 0 : pageNum + 1; m._mergeKeys [level] = _pages [level] [nextPage].FirstKey; page = _pages [level] [pageNum]; return(m); }