Skip to content

Commit

Permalink
RavenDB-3788 Porting changes from 3.5 - number of pages tracking.
Browse files Browse the repository at this point in the history
  • Loading branch information
Arkadiusz Palinski committed Aug 26, 2015
1 parent 8f323c4 commit 1841bb3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 51 deletions.
2 changes: 0 additions & 2 deletions Raven.Voron/Voron/Trees/PageSplitter.cs
Expand Up @@ -49,15 +49,13 @@ 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
{
Page newRootPage = _tree.NewPage(_tree.KeysPrefixing ? PageFlags.Branch | PageFlags.KeysPrefixed : PageFlags.Branch, 1);
_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);
Expand Down
88 changes: 44 additions & 44 deletions Raven.Voron/Voron/Trees/Tree.cs
Expand Up @@ -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;
}

Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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())
{
Expand Down
10 changes: 5 additions & 5 deletions Raven.Voron/Voron/Trees/TreeMutableState.cs
Expand Up @@ -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;
}
Expand Down

0 comments on commit 1841bb3

Please sign in to comment.