Repository: ignite Updated Branches: refs/heads/ignite-3477 40f015d18 -> ee28b9cb8
http://git-wip-us.apache.org/repos/asf/ignite/blob/ee28b9cb/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 0de3754..22bc17a 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 @@ -50,17 +50,22 @@ import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.GridRandom; import org.apache.ignite.internal.util.GridStripedLock; +import org.apache.ignite.internal.util.IgniteTree; import org.apache.ignite.internal.util.lang.GridCursor; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; import org.jsr166.ConcurrentLinkedHashMap; import static org.apache.ignite.internal.pagemem.PageIdUtils.effectivePageId; import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.rnd; +import static org.apache.ignite.internal.util.IgniteTree.OperationType.NOOP; +import static org.apache.ignite.internal.util.IgniteTree.OperationType.PUT; +import static org.apache.ignite.internal.util.IgniteTree.OperationType.REMOVE; /** */ @@ -189,6 +194,40 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { } /** + * @throws IgniteCheckedException If failed. + */ + public void _testBenchInvoke() throws IgniteCheckedException { + MAX_PER_PAGE = 10; + + TestTree tree = createTestTree(true); + + long start = System.nanoTime(); + + for (int i = 0; i < 10_000_000; i++) { + final long key = BPlusTree.randomInt(1000); + +// tree.findOne(key); // 39 +// tree.putx(key); // 22 + + tree.invoke(key, null, new IgniteTree.InvokeClosure<Long>() { // 25 + @Override public void call(@Nullable Long row) throws IgniteCheckedException { + // No-op. + } + + @Override public Long newRow() { + return key; + } + + @Override public IgniteTree.OperationType operationType() { + return PUT; + } + }); + } + + X.println(" __ time: " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); + } + + /** * @param cursor cursor to check. * @param iterator iterator with expected result. * @throws IgniteCheckedException If failed @@ -561,6 +600,127 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { /** * @throws IgniteCheckedException If failed. */ + public void testRandomInvoke_1_30_1() throws IgniteCheckedException { + MAX_PER_PAGE = 1; + CNT = 30; + + doTestRandomInvoke(true); + } + + /** + * @throws IgniteCheckedException If failed. + */ + public void testRandomInvoke_1_30_0() throws IgniteCheckedException { + MAX_PER_PAGE = 1; + CNT = 30; + + doTestRandomInvoke(false); + } + + /** + * @param canGetRow Can get row from inner page. + * @throws IgniteCheckedException If failed. + */ + private void doTestRandomInvoke(boolean canGetRow) throws IgniteCheckedException { + TestTree tree = createTestTree(canGetRow); + + Map<Long,Long> map = new HashMap<>(); + + int loops = reuseList == null ? 100_000 : 300_000; + + for (int i = 0 ; i < loops; i++) { + final Long x = (long)BPlusTree.randomInt(CNT); + final int rnd = BPlusTree.randomInt(11); + + if (i % 10_000 == 0) { +// X.println(tree.printTree()); + X.println(" --> " + i + " ++> " + x); + } + + // Update map. + if (!map.containsKey(x)) { + if (rnd % 2 == 0) { + map.put(x, x); + +// X.println("put0: " + x); + } + else { +// X.println("noop0: " + x); + } + } + else { + if (rnd % 2 == 0) { +// X.println("put1: " + x); + } + else if (rnd % 3 == 0) { + map.remove(x); + +// X.println("rmv1: " + x); + } + else { +// X.println("noop1: " + x); + } + } + + // Consistently update tree. + tree.invoke(x, null, new IgniteTree.InvokeClosure<Long>() { + + IgniteTree.OperationType op; + + Long newRow; + + @Override public void call(@Nullable Long row) throws IgniteCheckedException { + if (row == null) { + if (rnd % 2 == 0) { + op = PUT; + newRow = x; + } + else { + op = NOOP; + newRow = null; + } + } + else { + assertEquals(x, row); + + if (rnd % 2 == 0) { + op = PUT; + newRow = x; // We can not replace x with y here, because keys must be equal. + } + else if (rnd % 3 == 0) { + op = REMOVE; + newRow = null; + } + else { + op = NOOP; + newRow = null; + } + } + } + + @Override public Long newRow() { + return newRow; + } + + @Override public IgniteTree.OperationType operationType() { + return op; + } + }); + + assertNoLocks(); + +// X.println(tree.printTree()); + + tree.validateTree(); + + if (i % 100 == 0) + assertEqualContents(tree, map); + } + } + + /** + * @throws IgniteCheckedException If failed. + */ public void testRandomPutRemove_1_30_0() throws IgniteCheckedException { MAX_PER_PAGE = 1; CNT = 30; @@ -840,24 +1000,32 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { // X.println(tree.printTree()); tree.validateTree(); - if (i % 100 == 0) { - GridCursor<Long> cursor = tree.find(null, null); - - while (cursor.next()) { - x = cursor.get(); + if (i % 100 == 0) + assertEqualContents(tree, map); + } + } - assert x != null; + /** + * @param tree Tree. + * @param map Map. + * @throws IgniteCheckedException If failed. + */ + private void assertEqualContents(IgniteTree<Long, Long> tree, Map<Long,Long> map) throws IgniteCheckedException { + GridCursor<Long> cursor = tree.find(null, null); - assertEquals(map.get(x), x); + while (cursor.next()) { + Long x = cursor.get(); - assertNoLocks(); - } + assert x != null; - assertEquals(map.size(), tree.size()); + assertEquals(map.get(x), x); - assertNoLocks(); - } + assertNoLocks(); } + + assertEquals(map.size(), tree.size()); + + assertNoLocks(); } /** @@ -1039,27 +1207,28 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { final GridStripedLock lock = new GridStripedLock(256); + final String[] ops = {"put", "rmv", "inv_put", "inv_rmv"}; + IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Object>() { @Override public Object call() throws Exception { for (int i = 0; i < loops; i++) { - Long x = (long)DataStructure.randomInt(CNT); - - boolean put = DataStructure.randomInt(2) == 0; + final Long x = (long)DataStructure.randomInt(CNT); + final int op = DataStructure.randomInt(4); if (i % 10000 == 0) - X.println(" --> " + (put ? "put " : "rmv ") + i + " " + x); + X.println(" --> " + ops[op] + "_" + i + " " + x); Lock l = lock.getLock(x.longValue()); l.lock(); try { - if (put) { + if (op == 0) { // Put. assertEquals(map.put(x, x), tree.put(x)); assertNoLocks(); } - else { + else if (op == 1) { // Remove. if (map.remove(x) != null) { assertEquals(x, tree.remove(x)); @@ -1070,6 +1239,54 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { assertNoLocks(); } + else if (op == 2) { + tree.invoke(x, null, new IgniteTree.InvokeClosure<Long>() { + IgniteTree.OperationType opType; + + @Override public void call(@Nullable Long row) throws IgniteCheckedException { + opType = PUT; + + if (row != null) + assertEquals(x, row); + } + + @Override public Long newRow() { + return x; + } + + @Override public IgniteTree.OperationType operationType() { + return opType; + } + }); + + map.put(x,x); + } + else if (op == 3) { + tree.invoke(x, null, new IgniteTree.InvokeClosure<Long>() { + IgniteTree.OperationType opType; + + @Override public void call(@Nullable Long row) throws IgniteCheckedException { + if (row != null) { + assertEquals(x, row); + opType = REMOVE; + } + else + opType = NOOP; + } + + @Override public Long newRow() { + return null; + } + + @Override public IgniteTree.OperationType operationType() { + return opType; + } + }); + + map.remove(x); + } + else + fail(); } finally { l.unlock(); @@ -1240,7 +1457,8 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { } /** {@inheritDoc} */ - @Override protected Long getRow(BPlusIO<Long> io, long pageAddr, int idx) throws IgniteCheckedException { + @Override protected Long getRow(BPlusIO<Long> io, long pageAddr, int idx, Object ignore) + throws IgniteCheckedException { assert io.canGetRow() : io; return io.getLookupRow(this, pageAddr, idx); @@ -1276,11 +1494,17 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override public void onBeforeReadLock(Page page) { +// X.println(" onBeforeReadLock: " + U.hexLong(page.id())); +// +// U.dumpStack(); + assertNull(beforeReadLock.put(threadId(), page.id())); } /** {@inheritDoc} */ @Override public void onReadLock(Page page, long pageAddr) { +// X.println(" onReadLock: " + U.hexLong(page.id())); + if (pageAddr != 0L) { long pageId = PageIO.getPageId(pageAddr); @@ -1294,6 +1518,8 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override public void onReadUnlock(Page page, long pageAddr) { +// X.println(" onReadUnlock: " + U.hexLong(page.id())); + checkPageId(page, pageAddr); long pageId = PageIO.getPageId(pageAddr); @@ -1303,11 +1529,17 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override public void onBeforeWriteLock(Page page) { +// X.println(" onBeforeWriteLock: " + U.hexLong(page.id())); + assertNull(beforeWriteLock.put(threadId(), page.id())); } /** {@inheritDoc} */ @Override public void onWriteLock(Page page, long pageAddr) { +// X.println(" onWriteLock: " + U.hexLong(page.id())); +// +// U.dumpStack(); + if (pageAddr != 0L) { checkPageId(page, pageAddr); @@ -1324,6 +1556,8 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override public void onWriteUnlock(Page page, long pageAddr) { +// X.println(" onWriteUnlock: " + U.hexLong(page.id())); + assertEquals(effectivePageId(page.id()), effectivePageId(PageIO.getPageId(pageAddr))); assertEquals(Long.valueOf(page.id()), locks(false).remove(page.id())); http://git-wip-us.apache.org/repos/asf/ignite/blob/ee28b9cb/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java index d0d495e..ebf4aee 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java @@ -368,6 +368,11 @@ public class FreeListImplSelfTest extends GridCommonAbstractTest { } /** {@inheritDoc} */ + @Override public void key(KeyCacheObject key) { + this.key = (TestCacheObject)key; + } + + /** {@inheritDoc} */ @Override public CacheObject value() { return val; } http://git-wip-us.apache.org/repos/asf/ignite/blob/ee28b9cb/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java index 2442722..d9b820a 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java @@ -90,7 +90,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> { } /** {@inheritDoc} */ - @Override protected GridH2Row getRow(BPlusIO<SearchRow> io, long pageAddr, int idx) + @Override protected GridH2Row getRow(BPlusIO<SearchRow> io, long pageAddr, int idx, Object ignore) throws IgniteCheckedException { return (GridH2Row)io.getLookupRow(this, pageAddr, idx); } http://git-wip-us.apache.org/repos/asf/ignite/blob/ee28b9cb/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java index 6d4e97a..ce10cdb 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java @@ -66,6 +66,11 @@ public abstract class GridH2Row extends Row implements GridSearchRowPointer, Cac } /** {@inheritDoc} */ + @Override public void key(KeyCacheObject key) { + this.key = key; + } + + /** {@inheritDoc} */ @Override public CacheObject value() { return val; } http://git-wip-us.apache.org/repos/asf/ignite/blob/ee28b9cb/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java index 729309a..9c59faf 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java @@ -499,6 +499,11 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS } /** {@inheritDoc} */ + @Override public void invoke(GridSearchRowPointer key, Object x, InvokeClosure<GridH2Row> c) { + throw new UnsupportedOperationException(); + } + + /** {@inheritDoc} */ @Override public GridH2Row put(GridH2Row val) { return tree.put(val, val); }
