You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dm...@apache.org on 2015/10/07 09:55:17 UTC

ignite git commit: ignite-1272: storing user portable class descriptors only for classes that are loaded by default class loader

Repository: ignite
Updated Branches:
  refs/heads/ignite-1272 787347a98 -> 9c93f8bc7


ignite-1272: storing user portable class descriptors only for classes that are loaded by default class loader


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

Branch: refs/heads/ignite-1272
Commit: 9c93f8bc747ab73acd6e8fad75ba2e0ed56cc217
Parents: 787347a
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Oct 7 10:54:46 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Oct 7 10:54:46 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableContext.java      | 90 +++++---------------
 1 file changed, 23 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9c93f8bc/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
index d5a3c5d..0c762dd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
@@ -112,9 +112,8 @@ public class PortableContext implements Externalizable {
     /** */
     private final ConcurrentMap<Class<?>, PortableClassDescriptor> descByCls = new ConcurrentHashMap8<>();
 
-    /** */
-    private final ConcurrentMap<ClassLoader, ConcurrentMap<Integer, PortableClassDescriptor>> userTypes
-        = new ConcurrentHashMap8<>(0);
+    /** Holds classes loaded by default class loader only. */
+    private final ConcurrentMap<Integer, PortableClassDescriptor> userTypes = new ConcurrentHashMap8<>();
 
     /** */
     private final Map<Integer, PortableClassDescriptor> predefinedTypes = new HashMap<>();
@@ -129,7 +128,7 @@ public class PortableContext implements Externalizable {
     private final Map<Class<? extends Map>, Byte> mapTypes = new HashMap<>();
 
     /** */
-    private final Map<Integer, PortableIdMapper> mappers = new ConcurrentHashMap8<>(0);
+    private final ConcurrentMap<Integer, PortableIdMapper> mappers = new ConcurrentHashMap8<>(0);
 
     /** */
     private final Map<String, PortableIdMapper> typeMappers = new ConcurrentHashMap8<>(0);
@@ -468,12 +467,12 @@ public class PortableContext implements Externalizable {
         if (ldr == null)
             ldr = dfltLdr;
 
-        if (userType) {
-            desc = userTypesMap(ldr).get(typeId);
+        // If the type hasn't been loaded by default class loader then we mustn't return the descriptor from here
+        // giving a chance to a custom class loader to reload type's class.
+        if (userType && ldr.equals(dfltLdr)) {
+            desc = userTypes.get(typeId);
 
-            // If the type hasn't been loaded by default class loader then we mustn't return the descriptor from here
-            // giving a chance to a custom class loader to reload type's class.
-            if (desc != null && ldr.equals(dfltLdr))
+            if (desc != null)
                 return desc;
         }
 
@@ -485,13 +484,15 @@ public class PortableContext implements Externalizable {
             desc = descByCls.get(cls);
         }
         catch (ClassNotFoundException e) {
-            if (userType && !ldr.equals(dfltLdr) && (desc = descriptorLoadingFailover(typeId, ldr)) != null)
+            // Class might have been loaded by default class loader.
+            if (userType && !ldr.equals(dfltLdr) && (desc = descriptorForTypeId(true, typeId, dfltLdr)) != null)
                 return desc;
 
             throw new PortableInvalidClassException(e);
         }
         catch (IgniteCheckedException e) {
-            if (userType && !ldr.equals(dfltLdr) && (desc = descriptorLoadingFailover(typeId, ldr)) != null)
+            // Class might have been loaded by default class loader.
+            if (userType && !ldr.equals(dfltLdr) && (desc = descriptorForTypeId(true, typeId, dfltLdr)) != null)
                 return desc;
 
             throw new PortableException("Failed resolve class for ID: " + typeId, e);
@@ -507,29 +508,6 @@ public class PortableContext implements Externalizable {
     }
 
     /**
-     * The method must be used in case when it wasn't possible to load user type's class using custom class loader.
-     *
-     * There are several reasons why this may happen. First, type's name can be not registered in a system cache.
-     * Second, class might have been predefined explicitly and loaded by default class loader.
-     *
-     * @param typeId Type ID.
-     * @param ldr Class loader that failed to load type's class.
-     * @return Type descriptor on success, {@code null} on failure.
-     */
-    private PortableClassDescriptor descriptorLoadingFailover(int typeId, ClassLoader ldr) {
-        assert !ldr.equals(dfltLdr);
-
-        // Type name can be not registered in a system cache. Try to get from local map.
-        PortableClassDescriptor desc = userTypesMap(ldr).get(typeId);
-
-        if (desc == null)
-            // Class might have been loaded by default class loader.
-            desc = descriptorForTypeId(true, typeId, dfltLdr);
-
-        return desc;
-    }
-
-    /**
      * Creates and registers {@link PortableClassDescriptor} for the given {@code class}.
      *
      * @param cls Class.
@@ -577,7 +555,7 @@ public class PortableContext implements Externalizable {
 
         String typeName = typeName(cls.getName());
 
-        PortableIdMapper idMapper = idMapper(typeName);
+        PortableIdMapper idMapper = userTypeIdMapper(typeName);
 
         int typeId = idMapper.typeId(typeName);
 
@@ -605,10 +583,13 @@ public class PortableContext implements Externalizable {
 
         // perform put() instead of putIfAbsent() because "registered" flag might have been changed or class loader
         // might have reloaded described class.
-        userTypesMap(IgniteUtils.detectClassLoader(cls)).put(typeId, desc);
+        if (IgniteUtils.detectClassLoader(cls).equals(dfltLdr))
+            userTypes.put(typeId, desc);
 
         descByCls.put(cls, desc);
 
+        mappers.putIfAbsent(typeId, idMapper);
+
         // TODO uncomment for https://issues.apache.org/jira/browse/IGNITE-1377
 //        if (registerMetadata && isMetaDataEnabled(typeId))
 //            metaHnd.addMeta(typeId, new PortableMetaDataImpl(typeName, desc.fieldsMeta(), null));
@@ -658,7 +639,7 @@ public class PortableContext implements Externalizable {
         if (marshCtx.isSystemType(typeName))
             return typeName.hashCode();
 
-        return idMapper(shortTypeName).typeId(shortTypeName);
+        return userTypeIdMapper(shortTypeName).typeId(shortTypeName);
     }
 
     /**
@@ -667,14 +648,14 @@ public class PortableContext implements Externalizable {
      * @return Field ID.
      */
     public int fieldId(int typeId, String fieldName) {
-        return idMapper(typeId).fieldId(typeId, fieldName);
+        return userTypeIdMapper(typeId).fieldId(typeId, fieldName);
     }
 
     /**
      * @param typeId Type ID.
      * @return Instance of ID mapper.
      */
-    public PortableIdMapper idMapper(int typeId) {
+    public PortableIdMapper userTypeIdMapper(int typeId) {
         PortableIdMapper idMapper = mappers.get(typeId);
 
         if (idMapper != null)
@@ -683,11 +664,6 @@ public class PortableContext implements Externalizable {
         if (predefinedTypes.containsKey(typeId))
             return DFLT_ID_MAPPER;
 
-        for (ConcurrentMap<Integer, PortableClassDescriptor> types : userTypes.values()) {
-            if (types.containsKey(typeId))
-                return DFLT_ID_MAPPER;
-        }
-
         return BASIC_CLS_ID_MAPPER;
     }
 
@@ -695,7 +671,7 @@ public class PortableContext implements Externalizable {
      * @param typeName Type name.
      * @return Instance of ID mapper.
      */
-    private PortableIdMapper idMapper(String typeName) {
+    private PortableIdMapper userTypeIdMapper(String typeName) {
         PortableIdMapper idMapper = typeMappers.get(typeName);
 
         return idMapper != null ? idMapper : DFLT_ID_MAPPER;
@@ -828,7 +804,8 @@ public class PortableContext implements Externalizable {
 
             fieldsMeta = desc.fieldsMeta();
 
-            userTypesMap(IgniteUtils.detectClassLoader(cls)).put(id, desc);
+            if (IgniteUtils.detectClassLoader(cls).equals(dfltLdr))
+                userTypes.put(id, desc);
 
             descByCls.put(cls, desc);
         }
@@ -996,27 +973,6 @@ public class PortableContext implements Externalizable {
     }
 
     /**
-     * Returns user type map for specific class loader.
-     *
-     * @param ldr Class loader that loaded user type's class.
-     * @return User type map.
-     */
-    private ConcurrentMap<Integer, PortableClassDescriptor> userTypesMap(ClassLoader ldr) {
-        ConcurrentMap<Integer, PortableClassDescriptor> ldrMap = userTypes.get(ldr);
-
-        if (ldrMap == null) {
-            ConcurrentMap<Integer, PortableClassDescriptor> old = userTypes.putIfAbsent(ldr,
-                ldrMap = new ConcurrentHashMap8<>());
-
-            if (old != null)
-                ldrMap = old;
-        }
-
-        return ldrMap;
-    }
-
-
-    /**
      */
     private static class IdMapperWrapper implements PortableIdMapper {
         /** */