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");
 

Reply via email to