You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/06/24 10:30:29 UTC

incubator-ignite git commit: ignite-950: performance improvements

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-950 ca8d66e92 -> f632f1d95


ignite-950: performance improvements


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

Branch: refs/heads/ignite-950
Commit: f632f1d95bbe181b157f8c05bf1857a95fb4b0af
Parents: ca8d66e
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Jun 24 11:30:10 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Jun 24 11:30:10 2015 +0300

----------------------------------------------------------------------
 .../ignite/internal/util/GridHandleTable.java   |   9 ++
 .../optimized/OptimizedMarshallerExt.java       | 106 ++++++++++++-------
 .../OptimizedObjectInputStreamExt.java          |   6 +-
 .../OptimizedObjectOutputStreamExt.java         |   6 +-
 .../OptimizedObjectStreamSelfTest.java          |   3 +-
 modules/yardstick/pom.xml                       |   6 ++
 6 files changed, 88 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
index 639a5c1..fc117d4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
@@ -271,6 +271,15 @@ public class GridHandleTable {
         public int length() {
             return len;
         }
+
+        /**
+         * Returns object.
+         *
+         * @return Object.
+         */
+        public Object object() {
+            return object;
+        }
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerExt.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerExt.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerExt.java
index 9ed2d0a..684b29b 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerExt.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerExt.java
@@ -25,7 +25,7 @@ import org.apache.ignite.services.*;
 import org.jetbrains.annotations.*;
 
 import java.io.*;
-import java.util.*;
+import java.util.concurrent.*;
 
 import static org.apache.ignite.marshaller.optimized.OptimizedClassDescriptor.*;
 
@@ -52,6 +52,9 @@ public class OptimizedMarshallerExt extends OptimizedMarshaller {
     public static final byte VARIABLE_LEN = -1;
 
     /** */
+    private final static ConcurrentHashMap<Class<?>, Boolean> indexingEnabledCache = new ConcurrentHashMap<>();
+
+    /** */
     private volatile OptimizedMarshallerMetaHandler metaHandler;
 
     /**
@@ -103,6 +106,46 @@ public class OptimizedMarshallerExt extends OptimizedMarshaller {
     }
 
     /**
+     * Checks whether fields indexing is enabled for objects of the given {@code cls}.
+     *
+     * @param cls Class.
+     * @param metaHandler Metadata handler.
+     * @param ctx Marshaller context.
+     * @param clsMap Class map.
+     * @param mapper ID Mapper.
+     * @return {@code true} if fields indexing is enabled.
+     */
+    static boolean fieldsIndexingSupported(Class<?> cls, OptimizedMarshallerMetaHandler metaHandler,
+                                           MarshallerContext ctx, ConcurrentMap<Class, OptimizedClassDescriptor> clsMap,
+                                           OptimizedMarshallerIdMapper mapper) {
+        Boolean res = indexingEnabledCache.get(cls);
+
+        if (res != null)
+            return res;
+
+        if (isFieldsIndexingExcludedForClass(ctx, cls))
+            res = false;
+        else if (OptimizedMarshalAware.class.isAssignableFrom(cls))
+            res = true;
+        else {
+            try {
+                OptimizedClassDescriptor desc = OptimizedMarshallerUtils.classDescriptor(clsMap, cls, ctx, mapper);
+
+                res = desc.fields() != null && desc.fields().fieldsIndexingSupported() && metaHandler != null &&
+                    metaHandler.metadata(desc.typeId()) != null;
+            } catch (IOException e) {
+                throw new IgniteException("Failed to load class description: " + cls);
+            }
+        }
+
+        synchronized (indexingEnabledCache) {
+            indexingEnabledCache.putIfAbsent(cls, res);
+        }
+
+        return res;
+    }
+
+    /**
      * Enables fields indexing for the object of the given {@code cls}.
      *
      * If enabled then a footer will be added during marshalling of an object of the given {@code cls} to the end of
@@ -115,37 +158,40 @@ public class OptimizedMarshallerExt extends OptimizedMarshaller {
     public boolean enableFieldsIndexing(Class<?> cls) throws IgniteCheckedException {
         assert metaHandler != null;
 
-        if (isFieldsIndexingExcludedForClass(ctx, cls))
-            return false;
-
-        if (OptimizedMarshalAware.class.isAssignableFrom(cls))
-            return true;
+        boolean res;
 
-        try {
-            OptimizedClassDescriptor desc = OptimizedMarshallerUtils.classDescriptor(clsMap, cls, ctx, mapper);
+        if (isFieldsIndexingExcludedForClass(ctx, cls))
+            res = false;
+        else if (OptimizedMarshalAware.class.isAssignableFrom(cls))
+            res = true;
+        else {
+            try {
+                OptimizedClassDescriptor desc = OptimizedMarshallerUtils.classDescriptor(clsMap, cls, ctx, mapper);
 
-            if (desc.fields() != null && desc.fields().fieldsIndexingSupported()) {
-                //The function is called on kernel startup, calling metaHandler.metadata() will hang the grid,
-                //because the underlying cache is not ready.
-                //if (metaHandler.metadata(desc.typeId()) != null)
-                //    return true;
+                if (desc.fields() != null && desc.fields().fieldsIndexingSupported()) {
+                    OptimizedObjectMetadata meta = new OptimizedObjectMetadata();
 
-                OptimizedObjectMetadata meta = new OptimizedObjectMetadata();
+                    for (ClassFields clsFields : desc.fields().fieldsList())
+                        for (FieldInfo info : clsFields.fieldInfoList())
+                            meta.addMeta(info.id(), info.type());
 
-                for (ClassFields clsFields : desc.fields().fieldsList())
-                    for (FieldInfo info : clsFields.fieldInfoList())
-                        meta.addMeta(info.id(), info.type());
+                    metaHandler.addMeta(desc.typeId(), meta);
 
-                metaHandler.addMeta(desc.typeId(), meta);
+                    res = true;
+                }
+                else
+                    res = false;
 
-                return true;
+            } catch (IOException e) {
+                throw new IgniteCheckedException("Failed to put meta for class: " + cls.getName(), e);
             }
         }
-        catch (IOException e) {
-            throw new IgniteCheckedException("Failed to put meta for class: " + cls.getName(), e);
+
+        synchronized (indexingEnabledCache) {
+            indexingEnabledCache.put(cls, res);
         }
 
-        return false;
+        return res;
     }
 
     /**
@@ -157,21 +203,7 @@ public class OptimizedMarshallerExt extends OptimizedMarshaller {
     public boolean fieldsIndexingEnabled(Class<?> cls) {
         assert metaHandler != null;
 
-        if (isFieldsIndexingExcludedForClass(ctx, cls))
-            return false;
-
-        if (OptimizedMarshalAware.class.isAssignableFrom(cls))
-            return true;
-
-        try {
-            OptimizedClassDescriptor desc = OptimizedMarshallerUtils.classDescriptor(clsMap, cls, ctx, mapper);
-
-            return desc.fields() != null && desc.fields().fieldsIndexingSupported() &&
-                metaHandler.metadata(desc.typeId()) != null;
-        }
-        catch (IOException e) {
-            throw new IgniteException("Failed to load class description: " + cls);
-        }
+        return fieldsIndexingSupported(cls, metaHandler, ctx, clsMap, mapper);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStreamExt.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStreamExt.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStreamExt.java
index 49c9339..622c19f 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStreamExt.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStreamExt.java
@@ -20,7 +20,6 @@ import org.apache.ignite.internal.util.io.*;
 
 import java.io.*;
 
-import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.*;
 import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerExt.*;
 
 
@@ -35,10 +34,7 @@ public class OptimizedObjectInputStreamExt extends OptimizedObjectInputStream {
 
     /** {@inheritDoc} */
     @Override protected void skipFooter(Class<?> cls) throws IOException {
-        if (isFieldsIndexingExcludedForClass(ctx, cls))
-            return;
-
-        if (metaHandler != null && metaHandler.metadata(resolveTypeId(cls.getName(), mapper)) != null) {
+        if (fieldsIndexingSupported(cls, metaHandler, ctx, clsMap, mapper)) {
             short footerLen = in.readShort();
 
             if (footerLen != EMPTY_FOOTER)

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStreamExt.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStreamExt.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStreamExt.java
index b7dfda2..2be3165 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStreamExt.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStreamExt.java
@@ -47,11 +47,7 @@ public class OptimizedObjectOutputStreamExt extends OptimizedObjectOutputStream
 
     /** {@inheritDoc} */
     @Override protected Footer createFooter(Class<?> cls) {
-        if (OptimizedMarshallerExt.isFieldsIndexingExcludedForClass(ctx, cls))
-            return null;
-
-        if (OptimizedMarshalAware.class.isAssignableFrom(cls) || (metaHandler != null &&
-            metaHandler.metadata(resolveTypeId(cls.getName(), mapper)) != null))
+        if (fieldsIndexingSupported(cls, metaHandler, ctx, clsMap, mapper))
             return new FooterImpl();
 
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
index 20391eb..5f16a22 100644
--- a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.marshaller.optimized;
 
 import org.apache.ignite.*;
+import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.io.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
@@ -1065,7 +1066,7 @@ public class OptimizedObjectStreamSelfTest extends GridCommonAbstractTest {
             else {
                 assertFalse(inHandles[i] == null);
 
-                assertTrue(outHandles[i].getClass() == inHandles[i].getClass());
+                assertTrue(((GridHandleTable.ObjectInfo)outHandles[i]).object().getClass() == inHandles[i].getClass());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f632f1d9/modules/yardstick/pom.xml
----------------------------------------------------------------------
diff --git a/modules/yardstick/pom.xml b/modules/yardstick/pom.xml
index 5307447..80dfedf 100644
--- a/modules/yardstick/pom.xml
+++ b/modules/yardstick/pom.xml
@@ -40,6 +40,12 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>0.1</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.ignite</groupId>
             <artifactId>ignite-core</artifactId>
             <version>${project.version}</version>