ignite-db-x - do not use row in wal
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7663c226 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7663c226 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7663c226 Branch: refs/heads/ignite-4652 Commit: 7663c22682c3b3371590abfca8a687b4d4cd219b Parents: db548dc Author: Sergi Vladykin <sergi.vlady...@gmail.com> Authored: Thu Feb 16 13:28:13 2017 +0300 Committer: Sergi Vladykin <sergi.vlady...@gmail.com> Committed: Thu Feb 16 13:28:13 2017 +0300 ---------------------------------------------------------------------- .../pagemem/wal/record/delta/InsertRecord.java | 25 ++++++++++-------- .../wal/record/delta/NewRootInitRecord.java | 26 +++++++++++++------ .../pagemem/wal/record/delta/ReplaceRecord.java | 23 +++++++++-------- .../cache/database/tree/BPlusTree.java | 27 ++++++++++++-------- .../cache/database/tree/io/BPlusIO.java | 19 +++++++++++--- .../cache/database/tree/io/BPlusInnerIO.java | 20 ++++++++++----- .../processors/database/BPlusTreeSelfTest.java | 2 +- 7 files changed, 93 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InsertRecord.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InsertRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InsertRecord.java index fa598b2..f6d8f8c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InsertRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InsertRecord.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.pagemem.wal.record.delta; -import java.nio.ByteBuffer; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO; @@ -33,9 +32,6 @@ public class InsertRecord<L> extends PageDeltaRecord { private int idx; /** */ - private L row; - - /** */ private byte[] rowBytes; /** */ @@ -50,7 +46,6 @@ public class InsertRecord<L> extends PageDeltaRecord { * @param pageId Page ID. * @param io IO. * @param idx Index. - * @param row Row. * @param rowBytes Row bytes. * @param rightId Right ID. */ @@ -59,7 +54,6 @@ public class InsertRecord<L> extends PageDeltaRecord { long pageId, BPlusIO<L> io, int idx, - L row, byte[] rowBytes, long rightId ) { @@ -67,14 +61,13 @@ public class InsertRecord<L> extends PageDeltaRecord { this.io = io; this.idx = idx; - this.row = row; this.rowBytes = rowBytes; this.rightId = rightId; } /** {@inheritDoc} */ @Override public void applyDelta(PageMemory pageMem, long pageAddr) throws IgniteCheckedException { - io.insert(pageAddr, idx, row, rowBytes, rightId); + io.insert(pageAddr, idx, null, rowBytes, rightId, false); } /** {@inheritDoc} */ @@ -82,20 +75,32 @@ public class InsertRecord<L> extends PageDeltaRecord { return RecordType.BTREE_PAGE_INSERT; } + /** + * @return IO. + */ public BPlusIO<L> io() { return io; } + /** + * @return Index. + */ public int index() { return idx; } + /** + * @return Right ID. + */ public long rightId() { return rightId; } - public L row() { - return row; + /** + * @return Row bytes. + */ + public byte[] rowBytes() { + return rowBytes; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/NewRootInitRecord.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/NewRootInitRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/NewRootInitRecord.java index 26ee364..277d773 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/NewRootInitRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/NewRootInitRecord.java @@ -35,9 +35,6 @@ public class NewRootInitRecord<L> extends PageDeltaRecord { private long leftChildId; /** */ - private L row; - - /** */ private byte[] rowBytes; /** */ @@ -57,7 +54,6 @@ public class NewRootInitRecord<L> extends PageDeltaRecord { long newRootId, BPlusInnerIO<L> io, long leftChildId, - L row, byte[] rowBytes, long rightChildId ) { @@ -68,14 +64,13 @@ public class NewRootInitRecord<L> extends PageDeltaRecord { this.newRootId = newRootId; this.io = io; this.leftChildId = leftChildId; - this.row = row; this.rowBytes = rowBytes; this.rightChildId = rightChildId; } /** {@inheritDoc} */ @Override public void applyDelta(PageMemory pageMem, long pageAddr) throws IgniteCheckedException { - io.initNewRoot(pageAddr, newRootId, leftChildId, row, rowBytes, rightChildId, pageMem.pageSize()); + io.initNewRoot(pageAddr, newRootId, leftChildId, null, rowBytes, rightChildId, pageMem.pageSize(), false); } /** {@inheritDoc} */ @@ -83,23 +78,38 @@ public class NewRootInitRecord<L> extends PageDeltaRecord { return RecordType.BTREE_INIT_NEW_ROOT; } + /** + * @return IO. + */ public BPlusInnerIO<L> io() { return io; } + /** + * @return Root page ID. + */ public long rootId() { return newRootId; } + /** + * @return Left child ID. + */ public long leftId() { return leftChildId; } + /** + * @return Right child ID. + */ public long rightId() { return rightChildId; } - public L row() { - return row; + /** + * @return Row bytes. + */ + public byte[] rowBytes() { + return rowBytes; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/ReplaceRecord.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/ReplaceRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/ReplaceRecord.java index 757afe1..4e85c43 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/ReplaceRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/ReplaceRecord.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.pagemem.wal.record.delta; -import java.nio.ByteBuffer; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO; @@ -30,9 +29,6 @@ public class ReplaceRecord<L> extends PageDeltaRecord { private BPlusIO<L> io; /** */ - private L row; - - /** */ private byte[] rowBytes; /** */ @@ -42,15 +38,13 @@ public class ReplaceRecord<L> extends PageDeltaRecord { * @param cacheId Cache ID. * @param pageId Page ID. * @param io IO. - * @param row Row. * @param rowBytes Row bytes. * @param idx Index. */ - public ReplaceRecord(int cacheId, long pageId, BPlusIO<L> io, L row, byte[] rowBytes, int idx) { + public ReplaceRecord(int cacheId, long pageId, BPlusIO<L> io, byte[] rowBytes, int idx) { super(cacheId, pageId); this.io = io; - this.row = row; this.rowBytes = rowBytes; this.idx = idx; } @@ -61,7 +55,7 @@ public class ReplaceRecord<L> extends PageDeltaRecord { if (io.getCount(pageAddr) < idx) throw new DeltaApplicationException("Index is greater than count: " + idx); - io.store(pageAddr, idx, row, rowBytes); + io.store(pageAddr, idx, null, rowBytes, false); } /** {@inheritDoc} */ @@ -69,15 +63,24 @@ public class ReplaceRecord<L> extends PageDeltaRecord { return RecordType.BTREE_PAGE_REPLACE; } + /** + * @return IO. + */ public BPlusIO<L> io() { return io; } + /** + * @return Index. + */ public int index() { return idx; } - public L row() { - return row; + /** + * @return Row bytes. + */ + public byte[] rowBytes() { + return rowBytes; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java index a0dff8c..518d0d8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java @@ -362,10 +362,12 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements assert p.needReplaceInner == FALSE || p.needReplaceInner == DONE : p.needReplaceInner; } - io.store(pageAddr, idx, newRow, null); + boolean needWal = needWalDeltaRecord(page); - if (needWalDeltaRecord(page)) - wal.log(new ReplaceRecord<>(cacheId, page.id(), io, newRow, null, idx)); + byte[] newRowBytes = io.store(pageAddr, idx, newRow, null, needWal); + + if (needWal) + wal.log(new ReplaceRecord<>(cacheId, page.id(), io, newRowBytes, idx)); return FOUND; } @@ -2340,10 +2342,12 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements */ private void insertSimple(Page page, BPlusIO<L> io, long pageAddr, int idx) throws IgniteCheckedException { - io.insert(pageAddr, idx, row, null, rightId); + boolean needWal = needWalDeltaRecord(page); - if (needWalDeltaRecord(page)) - wal.log(new InsertRecord<>(cacheId, page.id(), io, idx, row, null, rightId)); + byte[] rowBytes = io.insert(pageAddr, idx, row, null, rightId, needWal); + + if (needWal) + wal.log(new InsertRecord<>(cacheId, page.id(), io, idx, rowBytes, rightId)); } /** @@ -2420,17 +2424,20 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements long pageId = PageIO.getPageId(pageAddr); - inner(io).initNewRoot(newRootPageAddr, + boolean needWal = needWalDeltaRecord(newRoot); + + byte[] moveUpRowBytes = inner(io).initNewRoot(newRootPageAddr, newRootId, pageId, moveUpRow, null, fwdId, - pageSize()); + pageSize(), + needWal); - if (needWalDeltaRecord(newRoot)) + if (needWal) wal.log(new NewRootInitRecord<>(cacheId, newRoot.id(), newRootId, - inner(io), pageId, moveUpRow, null, fwdId)); + inner(io), pageId, moveUpRowBytes, fwdId)); } finally { writeUnlock(newRoot, newRootPageAddr, true); http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java index 0cf1385..5186808 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java @@ -170,15 +170,24 @@ public abstract class BPlusIO<L> extends PageIO { * @param idx Index. * @param row Lookup or full row. * @param rowBytes Row bytes. + * @param needRowBytes If we need stored row bytes. + * @return Stored row bytes. * @throws IgniteCheckedException If failed. */ - public final void store(long pageAddr, int idx, L row, byte[] rowBytes) throws IgniteCheckedException { + public final byte[] store(long pageAddr, int idx, L row, byte[] rowBytes, boolean needRowBytes) + throws IgniteCheckedException { int off = offset(idx); - if (rowBytes == null) + if (rowBytes == null) { storeByOffset(pageAddr, off, row); + + if (needRowBytes) + rowBytes = PageUtils.getBytes(pageAddr, off, getItemSize()); + } else putBytes(pageAddr, off, rowBytes); + + return rowBytes; } /** @@ -244,9 +253,11 @@ public abstract class BPlusIO<L> extends PageIO { * @param row Row to insert. * @param rowBytes Row bytes. * @param rightId Page ID which will be to the right child for the inserted item. + * @param needRowBytes If we need stored row bytes. + * @return Row bytes. * @throws IgniteCheckedException If failed. */ - public void insert(long pageAddr, int idx, L row, byte[] rowBytes, long rightId) + public byte[] insert(long pageAddr, int idx, L row, byte[] rowBytes, long rightId, boolean needRowBytes) throws IgniteCheckedException { int cnt = getCount(pageAddr); @@ -255,7 +266,7 @@ public abstract class BPlusIO<L> extends PageIO { setCount(pageAddr, cnt + 1); - store(pageAddr, idx, row, rowBytes); + return store(pageAddr, idx, row, rowBytes, needRowBytes); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java index c7018bd..b15c2dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java @@ -130,17 +130,20 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> { // Methods for B+Tree logic. /** {@inheritDoc} */ - @Override public void insert( + @Override public byte[] insert( long pageAddr, int idx, L row, byte[] rowBytes, - long rightId + long rightId, + boolean needRowBytes ) throws IgniteCheckedException { - super.insert(pageAddr, idx, row, rowBytes, rightId); + rowBytes = super.insert(pageAddr, idx, row, rowBytes, rightId, needRowBytes); // Setup reference to the right page on split. setRight(pageAddr, idx, rightId); + + return rowBytes; } /** @@ -151,22 +154,27 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> { * @param rowBytes Bytes. * @param rightChildId Right child ID. * @param pageSize Page size. + * @param needRowBytes If we need row bytes back. + * @return Row bytes. * @throws IgniteCheckedException If failed. */ - public void initNewRoot( + public byte[] initNewRoot( long newRootPageAddr, long newRootId, long leftChildId, L row, byte[] rowBytes, long rightChildId, - int pageSize + int pageSize, + boolean needRowBytes ) throws IgniteCheckedException { initNewPage(newRootPageAddr, newRootId, pageSize); setCount(newRootPageAddr, 1); setLeft(newRootPageAddr, 0, leftChildId); - store(newRootPageAddr, 0, row, rowBytes); + rowBytes = store(newRootPageAddr, 0, row, rowBytes, needRowBytes); setRight(newRootPageAddr, 0, rightChildId); + + return rowBytes; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/7663c226/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java index 2d9c693..0de3754 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java @@ -1403,7 +1403,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { throws IgniteCheckedException { Long row = srcIo.getLookupRow(null, src, srcIdx); - store(dst, dstIdx, row, null); + store(dst, dstIdx, row, null, false); } /**