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 <dma...@gridgain.com> Authored: Wed Jun 24 11:30:10 2015 +0300 Committer: Denis Magda <dma...@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>