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(); } }
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)); } } } }
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; } }