private IEnumerator <KeyValuePair <Key, Value> > GetEnumerator() { if (NextPageIndex < 0) { StopEnumerating = true; yield break; } PageRecord page = ActiveManifest.FindPageForIndex(Level, NextPageIndex++); if (page == null) { StopEnumerating = true; yield break; } var sbt = new SortedBlockTable(Cache, BaseFileName, page.Level, page.Version); try { foreach (var pair in sbt.EnumerateFromKey(Cache, StartKey)) { yield return(pair); } } finally { sbt.Close(); } }
public void NotifyPageReleased(PageRecord pageRec) { string path = null; path = Config.SortedBlockTableFile(BaseFileName, pageRec.Level, pageRec.Version); Helper.DeleteFile(path); }
// Atomically add page specifications to the manifest public ManifestImmutable AddPage(int level, int version, Key firstKey, Key lastKey) { 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); }
internal void ReadManifestContents(BinaryReader reader) { // read num versions or the razor format at the beginning of the block int num_versions = reader.Read7BitEncodedInt(); if (num_versions == RAZORFORMATSECRET) { RazorFormatVersion = reader.Read7BitEncodedInt(); num_versions = reader.Read7BitEncodedInt(); } else { RazorFormatVersion = -1; // all unnumbered formats } 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 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); }