Example #1
0
        public List <long> AllPages()
        {
            var results = new List <long>();
            var stack   = new Stack <Page>();
            var root    = _tx.GetReadOnlyPage(State.RootPageNumber);

            stack.Push(root);

            while (stack.Count > 0)
            {
                var p = stack.Pop();
                results.Add(p.PageNumber);

                var key = p.CreateNewEmptyKey();

                for (int i = 0; i < p.NumberOfEntries; i++)
                {
                    var node       = p.GetNode(i);
                    var pageNumber = node->PageNumber;
                    if (p.IsBranch)
                    {
                        stack.Push(_tx.GetReadOnlyPage(pageNumber));
                    }
                    else if (node->Flags == NodeFlags.PageRef)
                    {
                        // This is an overflow page
                        var overflowPage  = _tx.GetReadOnlyPage(pageNumber);
                        var numberOfPages = _tx.DataPager.GetNumberOfOverflowPages(overflowPage.OverflowSize);
                        for (long j = 0; j < numberOfPages; ++j)
                        {
                            results.Add(overflowPage.PageNumber + j);
                        }
                    }
                    else if (node->Flags == NodeFlags.MultiValuePageRef)
                    {
                        // this is a multi value
                        p.SetNodeKey(node, ref key);
                        var tree = OpenMultiValueTree(_tx, (Slice)key, node);
                        results.AddRange(tree.AllPages());
                    }
                    else
                    {
                        if (State.Flags.HasFlag(TreeFlags.FixedSizeTrees))
                        {
                            var  valueReader = NodeHeader.Reader(_tx, node);
                            byte valueSize   = *valueReader.Base;

                            var fixedSizeTreeName = p.GetNodeKey(i);

                            var fixedSizeTree = new FixedSizeTree(_tx, this, (Slice)fixedSizeTreeName, valueSize);

                            var pages = fixedSizeTree.AllPages();
                            results.AddRange(pages);
                        }
                    }
                }
            }
            return(results);
        }
Example #2
0
        public List <long> AllPages()
        {
            var results = new List <long>();
            var stack   = new Stack <TreePage>();
            var root    = _llt.GetReadOnlyTreePage(State.RootPageNumber);

            stack.Push(root);

            Slice key = default(Slice);

            while (stack.Count > 0)
            {
                var p = stack.Pop();
                results.Add(p.PageNumber);

                for (int i = 0; i < p.NumberOfEntries; i++)
                {
                    var node       = p.GetNode(i);
                    var pageNumber = node->PageNumber;
                    if (p.IsBranch)
                    {
                        stack.Push(_llt.GetReadOnlyTreePage(pageNumber));
                    }
                    else if (node->Flags == TreeNodeFlags.PageRef)
                    {
                        // This is an overflow page
                        var overflowPage  = _llt.GetReadOnlyTreePage(pageNumber);
                        var numberOfPages = _llt.DataPager.GetNumberOfOverflowPages(overflowPage.OverflowSize);
                        for (long j = 0; j < numberOfPages; ++j)
                        {
                            results.Add(overflowPage.PageNumber + j);
                        }
                    }
                    else if (node->Flags == TreeNodeFlags.MultiValuePageRef)
                    {
                        key = TreeNodeHeader.ToSlicePtr(_tx.Allocator, node, ByteStringType.Mutable);
                        var tree = OpenMultiValueTree(key, node);
                        results.AddRange(tree.AllPages());
                    }
                    else
                    {
                        if ((State.Flags & TreeFlags.FixedSizeTrees) == TreeFlags.FixedSizeTrees)
                        {
                            var valueReader = TreeNodeHeader.Reader(_llt, node);
                            var valueSize   = ((FixedSizeTreeHeader.Embedded *)valueReader.Base)->ValueSize;

                            var fixedSizeTreeName = p.GetNodeKey(_llt, i);

                            var fixedSizeTree = new FixedSizeTree(_llt, this, fixedSizeTreeName, valueSize);

                            var pages = fixedSizeTree.AllPages();
                            results.AddRange(pages);
                        }
                    }
                }
            }
            return(results);
        }
        private List <double> GetPageDensities(FixedSizeTree tree)
        {
            var densities = new List <double>();
            var allPages  = tree.AllPages();
            var pageSize  = _tx.Environment.Options.PageSize;

            for (var i = 0; i < allPages.Count; i++)
            {
                var fstp     = _tx.GetPage(allPages[i]).ToFixedSizeTreePage();
                var sizeUsed = Constants.FixedSizeTreePageHeaderSize +
                               (fstp.NumberOfEntries * (fstp.IsLeaf ? fstp.ValueSize : FixedSizeTree.BranchEntrySize));
                densities.Add(((double)sizeUsed) / pageSize);
            }
            return(densities);
        }
        private static List <double> GetPageDensities(FixedSizeTree tree)
        {
            var allPages = tree.AllPages();

            if (allPages.Count == 0)
            {
                return(null);
            }

            var densities = new List <double>();

            foreach (var pageNumber in allPages)
            {
                var page     = tree.Llt.GetPage(pageNumber);
                var fstp     = new FixedSizeTreePage(page.Pointer, tree.ValueSize + sizeof(long), Constants.Storage.PageSize);
                var sizeUsed = Constants.FixedSizeTree.PageHeaderSize +
                               fstp.NumberOfEntries * (fstp.IsLeaf ? fstp.ValueSize + sizeof(long) : FixedSizeTree.BranchEntrySize);
                densities.Add((double)sizeUsed / Constants.Storage.PageSize);
            }
            return(densities);
        }
Example #5
0
        public List <long> AllPages()
        {
            var results = new List <long>();
            var stack   = new Stack <TreePage>();
            var root    = GetReadOnlyTreePage(State.RootPageNumber);

            stack.Push(root);

            Slice key = default(Slice);

            while (stack.Count > 0)
            {
                var p = stack.Pop();
                results.Add(p.PageNumber);

                for (int i = 0; i < p.NumberOfEntries; i++)
                {
                    var node       = p.GetNode(i);
                    var pageNumber = node->PageNumber;
                    if (p.IsBranch)
                    {
                        stack.Push(GetReadOnlyTreePage(pageNumber));
                    }
                    else if (node->Flags == TreeNodeFlags.PageRef)
                    {
                        // This is an overflow page
                        var overflowPage  = GetReadOnlyTreePage(pageNumber);
                        var numberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(overflowPage.OverflowSize);
                        for (long j = 0; j < numberOfPages; ++j)
                        {
                            results.Add(overflowPage.PageNumber + j);
                        }
                    }
                    else if (node->Flags == TreeNodeFlags.MultiValuePageRef)
                    {
                        using (TreeNodeHeader.ToSlicePtr(_tx.Allocator, node, out key))
                        {
                            var tree = OpenMultiValueTree(key, node);
                            results.AddRange(tree.AllPages());
                        }
                    }
                    else
                    {
                        if ((State.Flags & TreeFlags.FixedSizeTrees) == TreeFlags.FixedSizeTrees)
                        {
                            var valueReader = GetValueReaderFromHeader(node);
                            var valueSize   = ((FixedSizeTreeHeader.Embedded *)valueReader.Base)->ValueSize;

                            Slice fixedSizeTreeName;
                            using (p.GetNodeKey(_llt, i, out fixedSizeTreeName))
                            {
                                var fixedSizeTree = new FixedSizeTree(_llt, this, fixedSizeTreeName, valueSize);

                                var pages = fixedSizeTree.AllPages();
                                results.AddRange(pages);

                                if ((State.Flags & TreeFlags.Streams) == TreeFlags.Streams)
                                {
                                    Debug.Assert(fixedSizeTree.ValueSize == ChunkDetails.SizeOf);

                                    var streamPages = GetStreamPages(fixedSizeTree, GetStreamInfo(fixedSizeTree.Name, writable: false));

                                    results.AddRange(streamPages);
                                }
                            }
                        }
                    }
                }
            }
            return(results);
        }