diff --git a/Raven.Voron/Voron/Trees/PageSplitter.cs b/Raven.Voron/Voron/Trees/PageSplitter.cs index 0693aa65aaa1..79b54676e8dd 100644 --- a/Raven.Voron/Voron/Trees/PageSplitter.cs +++ b/Raven.Voron/Voron/Trees/PageSplitter.cs @@ -49,7 +49,6 @@ public unsafe class PageSplitter public byte* Execute() { Page rightPage = _tree.NewPage(_page.Flags, 1); - _treeState.RecordNewPage(_page, 1); if (_cursor.PageCount == 0) // we need to do a root split { @@ -57,7 +56,6 @@ public unsafe class PageSplitter _cursor.Push(newRootPage); _treeState.RootPageNumber = newRootPage.PageNumber; _treeState.Depth++; - _treeState.RecordNewPage(newRootPage, 1); // now add implicit left page newRootPage.AddPageRefNode(0, _tree.KeysPrefixing ? (MemorySlice) PrefixedSlice.BeforeAllKeys : Slice.BeforeAllKeys, _page.PageNumber); diff --git a/Raven.Voron/Voron/Trees/Tree.cs b/Raven.Voron/Voron/Trees/Tree.cs index 4c7877883065..55ca9093f3a1 100644 --- a/Raven.Voron/Voron/Trees/Tree.cs +++ b/Raven.Voron/Voron/Trees/Tree.cs @@ -234,7 +234,7 @@ private static void CopyStreamToPointer(Transaction tx, Stream value, byte* pos) else { // optimization for PageRef - try to overwrite existing overflows - if (TryOverwriteOverflowPages(State, node, key, len, version, out pos)) + if (TryOverwriteOverflowPages(node, key, len, version, out pos)) return pos; } @@ -252,7 +252,7 @@ private static void CopyStreamToPointer(Transaction tx, Stream value, byte* pos) var pageNumber = -1L; if (shouldGoToOverflowPage ?? _tx.DataPager.ShouldGoToOverflowPage(len)) { - pageNumber = WriteToOverflowPages(State, len, out overFlowPos); + pageNumber = WriteToOverflowPages(len, out overFlowPos); len = -1; nodeType = NodeFlags.PageRef; } @@ -295,18 +295,19 @@ private static void CopyStreamToPointer(Transaction tx, Stream value, byte* pos) return dataPos; } - private long WriteToOverflowPages(TreeMutableState txInfo, int overflowSize, out byte* dataPos) - { - var numberOfPages = _tx.DataPager.GetNumberOfOverflowPages(overflowSize); - var overflowPageStart = _tx.AllocatePage(numberOfPages, PageFlags.Overflow); - overflowPageStart.OverflowSize = overflowSize; - dataPos = overflowPageStart.Base + Constants.PageHeaderSize; - txInfo.OverflowPages += numberOfPages; - txInfo.PageCount += numberOfPages; - return overflowPageStart.PageNumber; - } + private long WriteToOverflowPages(int overflowSize, out byte* dataPos) + { + var numberOfPages = _tx.DataPager.GetNumberOfOverflowPages(overflowSize); + var overflowPageStart = _tx.AllocatePage(numberOfPages, PageFlags.Overflow); + overflowPageStart.OverflowSize = overflowSize; + dataPos = overflowPageStart.Base + Constants.PageHeaderSize; + + State.RecordNewPage(overflowPageStart, numberOfPages); + + return overflowPageStart.PageNumber; + } - private void RemoveLeafNode(Page page, out ushort nodeVersion) + private void RemoveLeafNode(Page page, out ushort nodeVersion) { var node = page.GetNode(page.LastSearchPosition); nodeVersion = node->Version; @@ -749,47 +750,46 @@ internal Tree Clone(Transaction tx) return new Tree(tx, _state.Clone()) { Name = Name }; } - private bool TryOverwriteOverflowPages(TreeMutableState treeState, NodeHeader* updatedNode, - MemorySlice key, int len, ushort? version, out byte* pos) - { - if (updatedNode->Flags == NodeFlags.PageRef && - _tx.Id <= _tx.Environment.OldestTransaction) // ensure MVCC - do not overwrite if there is some older active transaction that might read those overflows - { - var overflowPage = _tx.GetReadOnlyPage(updatedNode->PageNumber); + private bool TryOverwriteOverflowPages(NodeHeader* updatedNode, + MemorySlice key, int len, ushort? version, out byte* pos) + { + if (updatedNode->Flags == NodeFlags.PageRef && + _tx.Id <= _tx.Environment.OldestTransaction) // ensure MVCC - do not overwrite if there is some older active transaction that might read those overflows + { + var overflowPage = _tx.GetReadOnlyPage(updatedNode->PageNumber); - if (len <= overflowPage.OverflowSize) - { - CheckConcurrency(key, version, updatedNode->Version, TreeActionType.Add); + if (len <= overflowPage.OverflowSize) + { + CheckConcurrency(key, version, updatedNode->Version, TreeActionType.Add); - if (updatedNode->Version == ushort.MaxValue) - updatedNode->Version = 0; - updatedNode->Version++; + if (updatedNode->Version == ushort.MaxValue) + updatedNode->Version = 0; + updatedNode->Version++; - var availableOverflows = _tx.DataPager.GetNumberOfOverflowPages(overflowPage.OverflowSize); + var availableOverflows = _tx.DataPager.GetNumberOfOverflowPages(overflowPage.OverflowSize); - var requestedOverflows = _tx.DataPager.GetNumberOfOverflowPages(len); + var requestedOverflows = _tx.DataPager.GetNumberOfOverflowPages(len); - var overflowsToFree = availableOverflows - requestedOverflows; + var overflowsToFree = availableOverflows - requestedOverflows; - for (int i = 0; i < overflowsToFree; i++) - { - _tx.FreePage(overflowPage.PageNumber + requestedOverflows + i); - } + for (int i = 0; i < overflowsToFree; i++) + { + _tx.FreePage(overflowPage.PageNumber + requestedOverflows + i); + } - treeState.OverflowPages -= overflowsToFree; - treeState.PageCount -= overflowsToFree; + State.RecordFreedPage(overflowPage, overflowsToFree); // we use overflowPage here just to have an instance of Page to properly update stats - overflowPage.OverflowSize = len; + overflowPage.OverflowSize = len; - pos = overflowPage.Base + Constants.PageHeaderSize; - return true; - } - } - pos = null; - return false; - } + pos = overflowPage.Base + Constants.PageHeaderSize; + return true; + } + } + pos = null; + return false; + } - public Slice LastKeyOrDefault() + public Slice LastKeyOrDefault() { using (var it = Iterate()) { diff --git a/Raven.Voron/Voron/Trees/TreeMutableState.cs b/Raven.Voron/Voron/Trees/TreeMutableState.cs index 8f69622c8941..14d1cf0cabc7 100644 --- a/Raven.Voron/Voron/Trees/TreeMutableState.cs +++ b/Raven.Voron/Voron/Trees/TreeMutableState.cs @@ -63,17 +63,17 @@ public TreeMutableState Clone() public void RecordNewPage(Page p, int num) { - PageCount++; - var flags = p.Flags; - if ((flags & PageFlags.Branch) == PageFlags.Branch) + PageCount += num; + + if (p.IsBranch) { BranchPages++; } - else if ((flags & PageFlags.Leaf) == PageFlags.Leaf) + else if (p.IsLeaf) { LeafPages++; } - else if ((flags & PageFlags.Overflow) == PageFlags.Overflow) + else if (p.IsOverflow) { OverflowPages += num; }