Exemplo n.º 1
0
        public void DebugValidate(Tree tree, long root)
        {
            if (NumberOfEntries == 0)
            {
                return;
            }
#if VALIDATE
            if (Freed)
            {
                return;
            }
#endif
            if (IsBranch && NumberOfEntries < 2)
            {
                throw new InvalidOperationException("The branch page " + PageNumber + " has " + NumberOfEntries + " entry");
            }

            Slice prev;
            var   prevScope = GetNodeKey(tree.Llt, 0, out prev);
            try
            {
                var pages = new HashSet <long>();
                for (int i = 1; i < NumberOfEntries; i++)
                {
                    var   node = GetNode(i);
                    Slice current;
                    var   currentScope = GetNodeKey(tree.Llt, i, out current);

                    if (SliceComparer.CompareInline(prev, current) >= 0)
                    {
                        DebugStuff.RenderAndShowTree(tree, root);
                        throw new InvalidOperationException("The page " + PageNumber + " is not sorted");
                    }

                    if (node->Flags == (TreeNodeFlags.PageRef))
                    {
                        if (pages.Add(node->PageNumber) == false)
                        {
                            DebugStuff.RenderAndShowTree(tree, root);
                            throw new InvalidOperationException("The page " + PageNumber + " references same page multiple times");
                        }
                    }
                    prevScope.Dispose();
                    prev      = current;
                    prevScope = currentScope;
                }
            }
            finally
            {
                prevScope.Dispose();
            }
        }
Exemplo n.º 2
0
        public void DebugValidateTree(long rootPageNumber)
        {
            var pages = new HashSet <long>();
            var stack = new Stack <TreePage>();
            var root  = GetReadOnlyTreePage(rootPageNumber);

            stack.Push(root);
            pages.Add(rootPageNumber);
            while (stack.Count > 0)
            {
                var p = stack.Pop();

                using (p.IsCompressed ? (DecompressedLeafPage)(p = DecompressPage(p, skipCache: true)) : null)
                {
                    if (p.NumberOfEntries == 0 && p != root)
                    {
                        DebugStuff.RenderAndShowTree(this, rootPageNumber);
                        throw new InvalidOperationException("The page " + p.PageNumber + " is empty");
                    }
                    p.DebugValidate(this, rootPageNumber);
                    if (p.IsBranch == false)
                    {
                        continue;
                    }

                    if (p.NumberOfEntries < 2)
                    {
                        throw new InvalidOperationException("The branch page " + p.PageNumber + " has " +
                                                            p.NumberOfEntries + " entry");
                    }

                    for (int i = 0; i < p.NumberOfEntries; i++)
                    {
                        var page = p.GetNode(i)->PageNumber;
                        if (pages.Add(page) == false)
                        {
                            DebugStuff.RenderAndShowTree(this, rootPageNumber);
                            throw new InvalidOperationException("The page " + page + " already appeared in the tree!");
                        }
                        stack.Push(GetReadOnlyTreePage(page));
                    }
                }
            }
        }
Exemplo n.º 3
0
        public void DebugValidate(LowLevelTransaction tx, long root)
        {
            if (NumberOfEntries == 0)
            {
                return;
            }

            if (IsBranch && NumberOfEntries < 2)
            {
                throw new InvalidOperationException("The branch page " + PageNumber + " has " + NumberOfEntries + " entry");
            }

            var prev  = GetNodeKey(tx, 0);
            var pages = new HashSet <long>();

            for (int i = 1; i < NumberOfEntries; i++)
            {
                var node    = GetNode(i);
                var current = GetNodeKey(tx, i);

                if (SliceComparer.CompareInline(prev, current) >= 0)
                {
                    DebugStuff.RenderAndShowTree(tx, root);
                    throw new InvalidOperationException("The page " + PageNumber + " is not sorted");
                }

                if (node->Flags == (TreeNodeFlags.PageRef))
                {
                    if (pages.Add(node->PageNumber) == false)
                    {
                        DebugStuff.RenderAndShowTree(tx, root);
                        throw new InvalidOperationException("The page " + PageNumber + " references same page multiple times");
                    }
                }

                prev = current;
            }
        }