Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-cmp 7887e0448 -> 473af7962


ignite-3477 Try compare keys faster.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/473af796
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/473af796
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/473af796

Branch: refs/heads/ignite-3477-cmp
Commit: 473af7962fed9dbbac43bfd161a1f29dc3626d8e
Parents: 7887e04
Author: sboikov <[email protected]>
Authored: Tue Jan 24 16:58:28 2017 +0300
Committer: sboikov <[email protected]>
Committed: Tue Jan 24 16:58:28 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheOffheapManagerImpl.java    | 21 +++++-
 .../apache/ignite/internal/util/GridUnsafe.java |  3 +
 .../database/IgniteDbPutGetAbstractTest.java    | 77 ++++++++++++++++++++
 3 files changed, 98 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/473af796/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 047df48..e1ea6d1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -1349,7 +1349,7 @@ public class IgniteCacheOffheapManagerImpl extends 
GridCacheManagerAdapter imple
                     if (data.nextLink() == 0) {
                         long addr = pageAddr + data.offset();
 
-                        int len = PageUtils.getInt(addr, 0);
+                        final int len = PageUtils.getInt(addr, 0);
 
                         int lenCmp = Integer.compare(len, bytes.length);
 
@@ -1358,7 +1358,7 @@ public class IgniteCacheOffheapManagerImpl extends 
GridCacheManagerAdapter imple
 
                         addr += 5; // Skip length and type byte.
 
-                        int words = len / 8;
+                        final int words = len / 8;
 
                         for (int i = 0; i < words; i++) {
                             int off = i * 8;
@@ -1400,7 +1400,22 @@ public class IgniteCacheOffheapManagerImpl extends 
GridCacheManagerAdapter imple
             if (lenCmp != 0)
                 return lenCmp;
 
-            for (int i = 0; i < bytes1.length; i++) {
+            final int len = bytes1.length;
+            final int words = len / 8;
+
+            for (int i = 0; i < words; i++) {
+                int off = GridUnsafe.BYTE_ARR_INT_OFF + i * 8;
+
+                long b1 = GridUnsafe.getLong(bytes1, off);
+                long b2 = GridUnsafe.getLong(bytes2, off);
+
+                int cmp = Long.compare(b1, b2);
+
+                if (cmp != 0)
+                    return cmp;
+            }
+
+            for (int i = words * 8; i < len; i++) {
                 byte b1 = bytes1[i];
                 byte b2 = bytes2[i];
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/473af796/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
index 1926f01..bbbf22b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
@@ -67,6 +67,9 @@ public abstract class GridUnsafe {
     public static final long BYTE_ARR_OFF = 
UNSAFE.arrayBaseOffset(byte[].class);
 
     /** */
+    public static final int BYTE_ARR_INT_OFF = 
UNSAFE.arrayBaseOffset(byte[].class);
+
+    /** */
     public static final long SHORT_ARR_OFF = 
UNSAFE.arrayBaseOffset(short[].class);
 
     /** */

http://git-wip-us.apache.org/repos/asf/ignite/blob/473af796/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbPutGetAbstractTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbPutGetAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbPutGetAbstractTest.java
index 34745b4..c7a07e3 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbPutGetAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbPutGetAbstractTest.java
@@ -186,6 +186,9 @@ public abstract class IgniteDbPutGetAbstractTest extends 
GridCommonAbstractTest
         return false;
     };
 
+    /**
+     *
+     */
     public void testGradualRandomPutAllRemoveAll() {
         IgniteEx ig = grid(0);
 
@@ -391,6 +394,39 @@ public abstract class IgniteDbPutGetAbstractTest extends 
GridCommonAbstractTest
     }
 
     /**
+     * @throws Exception If failed.
+     */
+    public void testPutGetLargeKeys() throws Exception {
+        IgniteCache<LargeDbKey, Integer> cache = ignite(0).cache(null);
+
+        ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+        Map<Integer, LargeDbKey> keys = new HashMap<>();
+
+        for (int i = 0; i < 100; i++) {
+            LargeDbKey key = new LargeDbKey(i, 512 + rnd.nextInt(1024));
+
+            assertNull(cache.get(key));
+
+            cache.put(key, i);
+
+            keys.put(i, key);
+        }
+
+        Map<LargeDbKey, Integer> res = cache.getAll(new 
HashSet<>(keys.values()));
+
+        assertEquals(keys.size(), res.size());
+
+        for (Map.Entry<Integer, LargeDbKey> e : keys.entrySet())
+            assertEquals(e.getKey(), res.get(e.getValue()));
+
+        cache.removeAll(new HashSet<>(keys.values()));
+
+        for (LargeDbKey key : keys.values())
+            assertNull(cache.get(key));
+    }
+
+    /**
      * @param size Array size.
      * @return Array with random items.
      */
@@ -1350,6 +1386,47 @@ public abstract class IgniteDbPutGetAbstractTest extends 
GridCommonAbstractTest
     /**
      *
      */
+    private static class LargeDbKey implements Serializable {
+        /** */
+        private int val;
+
+        /** */
+        private byte[] data;
+
+        /**
+         * @param val Value.
+         * @param size Key payload size.
+         */
+        private LargeDbKey(int val, int size) {
+            this.val = val;
+
+            data = new byte[size];
+
+            Arrays.fill(data, (byte)val);
+        }
+
+        /** {@inheritDoc} */
+        @Override public boolean equals(Object o) {
+            if (this == o)
+                return true;
+
+            if (o == null || !(o instanceof LargeDbKey))
+                return false;
+
+            LargeDbKey key = (LargeDbKey)o;
+
+            return val == key.val && Arrays.equals(data, key.data);
+        }
+
+        /** {@inheritDoc} */
+        @Override public int hashCode() {
+            return val + Arrays.hashCode(data);
+        }
+    }
+
+    /**
+     *
+     */
     private static class DbValue implements Serializable {
         /** */
         @QuerySqlField(index = true)

Reply via email to