Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        public void NotifyPageReleased(PageRecord pageRec)
        {
            string path = Config.SortedBlockTableFile(BaseFileName, pageRec.Level, pageRec.Version);

            if (File.Exists(path))
            {
                File.Delete(path);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }