IGNITE-5301: Fixed invalid memcpy parameter ordering leading to JVM crash in H2TreeIndex. This closes #2029. This closes #2151.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/df121b55 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/df121b55 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/df121b55 Branch: refs/heads/ignite-2.1.2-exchange Commit: df121b553d3e9810d9931f76ddb42c32a75d6fc3 Parents: dde5506 Author: Eduard Shangareev <[email protected]> Authored: Sat Jun 17 12:46:55 2017 +0300 Committer: devozerov <[email protected]> Committed: Sat Jun 17 12:46:55 2017 +0300 ---------------------------------------------------------------------- .../persistence/freelist/io/PagesListNodeIO.java | 2 +- .../cache/persistence/tree/io/BPlusInnerIO.java | 4 ++-- .../cache/persistence/tree/io/BPlusLeafIO.java | 2 +- .../cache/persistence/tree/io/DataPageIO.java | 2 +- .../cache/persistence/tree/io/TrackingPageIO.java | 2 +- .../cache/persistence/tree/util/PageHandler.java | 14 ++++++-------- .../persistence/IgnitePdsDynamicCacheTest.java | 17 +++++++++++++++++ .../processors/query/h2/database/H2TreeIndex.java | 2 +- 8 files changed, 30 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListNodeIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListNodeIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListNodeIO.java index 7db89eb..9197d56 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListNodeIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListNodeIO.java @@ -210,7 +210,7 @@ public class PagesListNodeIO extends PageIO { for (int i = 0; i < cnt; i++) { if (getAt(pageAddr, i) == dataPageId) { if (i != cnt - 1) - copyMemory(pageAddr, pageAddr, offset(i + 1), offset(i), 8 * (cnt - i - 1)); + copyMemory(pageAddr, offset(i + 1), pageAddr, offset(i), 8 * (cnt - i - 1)); setCount(pageAddr, cnt - 1); http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusInnerIO.java index 88fc8c8..dabee7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusInnerIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusInnerIO.java @@ -100,7 +100,7 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> { cnt *= getItemSize() + 8; // From items to bytes. if (dstIdx > srcIdx) { - PageHandler.copyMemory(srcPageAddr, dstPageAddr, offset(srcIdx), offset(dstIdx), cnt); + PageHandler.copyMemory(srcPageAddr, offset(srcIdx), dstPageAddr, offset(dstIdx), cnt); if (cpLeft) PageUtils.putLong(dstPageAddr, offset0(dstIdx, SHIFT_LEFT), PageUtils.getLong(srcPageAddr, (offset0(srcIdx, SHIFT_LEFT)))); @@ -109,7 +109,7 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> { if (cpLeft) PageUtils.putLong(dstPageAddr, offset0(dstIdx, SHIFT_LEFT), PageUtils.getLong(srcPageAddr, (offset0(srcIdx, SHIFT_LEFT)))); - PageHandler.copyMemory(srcPageAddr, dstPageAddr, offset(srcIdx), offset(dstIdx), cnt); + PageHandler.copyMemory(srcPageAddr, offset(srcIdx), dstPageAddr, offset(dstIdx), cnt); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusLeafIO.java index 931bf10..aadf67e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusLeafIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusLeafIO.java @@ -43,7 +43,7 @@ public abstract class BPlusLeafIO<L> extends BPlusIO<L> { boolean cpLeft) throws IgniteCheckedException { assert srcIdx != dstIdx || srcPageAddr != dstPageAddr; - PageHandler.copyMemory(srcPageAddr, dstPageAddr, offset(srcIdx), offset(dstIdx), + PageHandler.copyMemory(srcPageAddr, offset(srcIdx), dstPageAddr, offset(dstIdx), cnt * getItemSize()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/DataPageIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/DataPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/DataPageIO.java index d8ed1a6..e177d83 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/DataPageIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/DataPageIO.java @@ -1371,7 +1371,7 @@ public class DataPageIO extends PageIO { assert off + step + cnt <= pageSize : "[off=" + off + ", step=" + step + ", cnt=" + cnt + ", cap=" + pageSize + ']'; - PageHandler.copyMemory(addr, addr, off, off + step, cnt); + PageHandler.copyMemory(addr, off, addr, off + step, cnt); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java index aa6ba9a..bbf452d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java @@ -139,7 +139,7 @@ public class TrackingPageIO extends PageIO { if (last - lastSuccessfulSnapshotId == 1) { //we should keep only data in last half //new data will be written in the same half, we should move old data to another half if ((nextSnapshotTag - last) % 2 == 0) - PageHandler.copyMemory(buf, buf, sizeOff, sizeOff2, len + SIZE_FIELD_SIZE); + PageHandler.copyMemory(buf, sizeOff, buf, sizeOff2, len + SIZE_FIELD_SIZE); } else { //last - lastSuccessfulSnapshotId > 1, e.g. we should merge two half in one int newSize = 0; int i = 0; http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java index b42258e..a87525a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java @@ -270,9 +270,8 @@ public abstract class PageHandler<X, R> { doInitPage(pageMem, cacheId, pageId, page, pageAddr, init, wal); walPlc = FALSE; } - else { + else init = PageIO.getPageIO(pageAddr); - } R res = h.run(cacheId, pageId, page, pageAddr, init, walPlc, arg, intArg); @@ -336,9 +335,8 @@ public abstract class PageHandler<X, R> { doInitPage(pageMem, cacheId, pageId, page, pageAddr, init, wal); walPlc = FALSE; } - else { + else init = PageIO.getPageIO(pageAddr); - } R res = h.run(cacheId, pageId, page, pageAddr, init, walPlc, arg, intArg); @@ -456,12 +454,12 @@ public abstract class PageHandler<X, R> { /** * @param src Source. - * @param dst Destination. * @param srcOff Source offset in bytes. + * @param dst Destination. * @param dstOff Destination offset in bytes. * @param cnt Bytes count to copy. */ - public static void copyMemory(ByteBuffer src, ByteBuffer dst, long srcOff, long dstOff, long cnt) { + public static void copyMemory(ByteBuffer src, long srcOff, ByteBuffer dst, long dstOff, long cnt) { byte[] srcArr = src.hasArray() ? src.array() : null; byte[] dstArr = dst.hasArray() ? dst.array() : null; long srcArrOff = src.hasArray() ? src.arrayOffset() + GridUnsafe.BYTE_ARR_OFF : 0; @@ -491,12 +489,12 @@ public abstract class PageHandler<X, R> { /** * @param srcAddr Source. - * @param dstAddr Destination. * @param srcOff Source offset in bytes. + * @param dstAddr Destination. * @param dstOff Destination offset in bytes. * @param cnt Bytes count to copy. */ - public static void copyMemory(long srcAddr, long dstAddr, long srcOff, long dstOff, long cnt) { + public static void copyMemory(long srcAddr, long srcOff, long dstAddr, long dstOff, long cnt) { GridUnsafe.copyMemory(null, srcAddr + srcOff, null, dstAddr + dstOff, cnt); } http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java index f30e785..ae4b850 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java @@ -17,12 +17,14 @@ package org.apache.ignite.internal.processors.cache.persistence; +import java.io.Serializable; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheRebalanceMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.MemoryConfiguration; @@ -48,6 +50,7 @@ public class IgnitePdsDynamicCacheTest extends IgniteDbDynamicCacheSelfTest { memPlcCfg.setInitialSize(200 * 1024 * 1024); memPlcCfg.setMaxSize(200 * 1024 * 1024); + dbCfg.setPageSize(1024); dbCfg.setMemoryPolicies(memPlcCfg); dbCfg.setDefaultMemoryPolicyName("dfltMemPlc"); @@ -113,6 +116,7 @@ public class IgnitePdsDynamicCacheTest extends IgniteDbDynamicCacheSelfTest { ccfg2.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); ccfg2.setRebalanceMode(CacheRebalanceMode.NONE); ccfg2.setAffinity(new RendezvousAffinityFunction(false, 32)); + ccfg2.setIndexedTypes(Integer.class, Value.class); ignite.createCache(ccfg1); ignite.createCache(ccfg2); @@ -150,4 +154,17 @@ public class IgnitePdsDynamicCacheTest extends IgniteDbDynamicCacheSelfTest { private void deleteWorkFiles() throws IgniteCheckedException { deleteRecursively(U.resolveWorkDirectory(U.defaultWorkDirectory(), "db", false)); } + + /** + * + */ + static class Value implements Serializable { + /** */ + @QuerySqlField(index = true, groups = "full_name") + String fName; + + /** */ + @QuerySqlField(index = true, groups = "full_name") + String lName; + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/df121b55/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java index 70d8632..e02510f 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java @@ -94,7 +94,7 @@ public class H2TreeIndex extends GridH2IndexBase { initBaseIndex(tbl, 0, name, cols, pk ? IndexType.createPrimaryKey(false, false) : IndexType.createNonUnique(false, false, false)); - name = tbl.rowDescriptor() == null ? "_" + name : tbl.rowDescriptor().type().typeId() + "_" + name; + name = (tbl.rowDescriptor() == null ? "" : tbl.rowDescriptor().type().typeId() + "_") + name; name = BPlusTree.treeName(name, "H2Tree");
