# IGNITE-141 - Marshallers refactoring
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/39c7f542 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/39c7f542 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/39c7f542 Branch: refs/heads/ignite-141 Commit: 39c7f542dac62efc3922167671295b3f49b9bc5e Parents: 8c0875f Author: Valentin Kulichenko <vkuliche...@gridgain.com> Authored: Tue Mar 3 12:28:45 2015 -0800 Committer: Valentin Kulichenko <vkuliche...@gridgain.com> Committed: Tue Mar 3 12:28:45 2015 -0800 ---------------------------------------------------------------------- .../ignite/internal/GridKernalContextImpl.java | 2 +- .../ignite/internal/MarshallerContextImpl.java | 58 ++++---------------- .../deployment/GridDeploymentLocalStore.java | 1 - .../GridDeploymentPerLoaderStore.java | 1 - .../GridDeploymentPerVersionStore.java | 1 - .../internal/util/nio/GridNioSelfTest.java | 18 ++++-- .../marshaller/MarshallerContextTestImpl.java | 17 ++++-- 7 files changed, 37 insertions(+), 61 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java index 2b83df3..8544c60 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java @@ -360,7 +360,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable this.igfsExecSvc = igfsExecSvc; this.restExecSvc = restExecSvc; - marshCtx = new MarshallerContextImpl(log); + marshCtx = new MarshallerContextImpl(); try { spring = SPRING.create(false); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java index 408e70d..f06896d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java @@ -19,14 +19,11 @@ package org.apache.ignite.internal; import org.apache.ignite.*; import org.apache.ignite.internal.processors.cache.*; -import org.apache.ignite.internal.util.typedef.*; import org.apache.ignite.internal.util.typedef.internal.*; -import org.apache.ignite.lang.*; import org.apache.ignite.marshaller.*; import org.jdk8.backport.*; import java.io.*; -import java.util.*; import java.util.concurrent.*; /** @@ -37,7 +34,7 @@ public class MarshallerContextImpl implements MarshallerContext { private static final String CLS_NAMES_FILE = "org/apache/ignite/internal/classnames.properties"; /** */ - private final ConcurrentMap<Integer, IgniteBiTuple<Class, Boolean>> clsById = new ConcurrentHashMap8<>(); + private final ConcurrentMap<Integer, String> clsNameById = new ConcurrentHashMap8<>(); /** */ private final CountDownLatch latch = new CountDownLatch(1); @@ -46,9 +43,9 @@ public class MarshallerContextImpl implements MarshallerContext { private volatile GridCacheAdapter<Integer, String> cache; /** - * @param log Logger. + * Constructor. */ - MarshallerContextImpl(IgniteLogger log) { + MarshallerContextImpl() { try { ClassLoader ldr = getClass().getClassLoader(); @@ -56,17 +53,8 @@ public class MarshallerContextImpl implements MarshallerContext { String clsName; - while ((clsName = rdr.readLine()) != null) { - try { - Class cls = U.forName(clsName, ldr); - - clsById.put(cls.getName().hashCode(), F.t(cls, true)); - } - catch (ClassNotFoundException | NoClassDefFoundError ignored) { - if (log.isDebugEnabled()) - log.debug("Class defined in classnames.properties doesn't exist (ignoring): " + clsName); - } - } + while ((clsName = rdr.readLine()) != null) + clsNameById.put(clsName.hashCode(), clsName); } catch (IOException e) { throw new IllegalStateException("Failed to initialize marshaller context.", e); @@ -84,29 +72,9 @@ public class MarshallerContextImpl implements MarshallerContext { latch.countDown(); } - /** - * @param ldr Undeployed class loader. - */ - public void onUndeployed(ClassLoader ldr) { - for (Map.Entry<Integer, IgniteBiTuple<Class, Boolean>> e : clsById.entrySet()) { - if (!e.getValue().get2() && ldr.equals(e.getValue().get1().getClassLoader())) - clsById.remove(e.getKey()); - } - } - - /** - * Clears cached classes. - */ - public void clear() { - for (Map.Entry<Integer, IgniteBiTuple<Class, Boolean>> e : clsById.entrySet()) { - if (!e.getValue().get2()) - clsById.remove(e.getKey()); - } - } - /** {@inheritDoc} */ @Override public void registerClass(int id, Class cls) { - if (clsById.putIfAbsent(id, F.t(cls, false)) == null) { + if (clsNameById.putIfAbsent(id, cls.getName()) == null) { try { if (cache == null) U.awaitQuiet(latch); @@ -126,14 +94,12 @@ public class MarshallerContextImpl implements MarshallerContext { /** {@inheritDoc} */ @Override public Class className(int id, ClassLoader ldr) throws ClassNotFoundException { - IgniteBiTuple<Class, Boolean> t = clsById.get(id); + String clsName = clsNameById.get(id); - if (t == null) { + if (clsName == null) { if (cache == null) U.awaitQuiet(latch); - String clsName; - try { clsName = cache.get(id); } @@ -143,14 +109,12 @@ public class MarshallerContextImpl implements MarshallerContext { assert clsName != null : id; - Class cls = U.forName(clsName, ldr); - - IgniteBiTuple<Class, Boolean> old = clsById.putIfAbsent(id, t = F.t(cls, false)); + String old = clsNameById.putIfAbsent(id, clsName); if (old != null) - t = old; + clsName = old; } - return t.get1(); + return U.forName(clsName, ldr); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java index 7657137..195621c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java @@ -522,7 +522,6 @@ class GridDeploymentLocalStore extends GridDeploymentStoreAdapter { if (dep.obsolete()) { // Resource cleanup. ctx.resource().onUndeployed(dep); - ctx.marshallerContext().onUndeployed(ldr); // Clear optimized marshaller's cache. If another marshaller is used, this is no-op. OptimizedMarshaller.onUndeploy(ldr); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerLoaderStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerLoaderStore.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerLoaderStore.java index 0d09489..7a98cbc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerLoaderStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerLoaderStore.java @@ -495,7 +495,6 @@ public class GridDeploymentPerLoaderStore extends GridDeploymentStoreAdapter { ctx.cache().onUndeployed(ldr); ctx.stream().onUndeployed(ldr); - ctx.marshallerContext().onUndeployed(ldr); // Clear optimized marshaller's cache. If another marshaller is used, this is no-op. OptimizedMarshaller.onUndeploy(ldr); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java index 6eb41aa..dc72248 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java @@ -1258,7 +1258,6 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { ctx.cache().onUndeployed(ldr); ctx.stream().onUndeployed(ldr); - ctx.marshallerContext().onUndeployed(ldr); // Clear optimized marshaller's cache. If another marshaller is used, this is no-op. OptimizedMarshaller.onUndeploy(ldr); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSelfTest.java index 83729fc..e3baeb0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSelfTest.java @@ -23,6 +23,7 @@ import org.apache.ignite.internal.util.*; import org.apache.ignite.internal.util.tostring.*; import org.apache.ignite.internal.util.typedef.*; import org.apache.ignite.internal.util.typedef.internal.*; +import org.apache.ignite.marshaller.*; import org.apache.ignite.testframework.junits.common.*; import org.jetbrains.annotations.*; @@ -63,14 +64,19 @@ public class GridNioSelfTest extends GridCommonAbstractTest { /** Count of statistics segments. */ private static final int STATISTICS_SEGMENTS_CNT = 10; - /** {@inheritDoc} */ - @Override protected void afterTestsStopped() throws Exception { - getTestResources().stopThreads(); - } + /** Marshaller. */ + private static volatile Marshaller marsh; /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { getTestResources().startThreads(true); + + marsh = getTestResources().getMarshaller(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + getTestResources().stopThreads(); } /** @@ -1115,7 +1121,7 @@ public class GridNioSelfTest extends GridCommonAbstractTest { * @throws IgniteCheckedException If failed. */ private <T extends Serializable> byte[] serializeMessage(T msg) throws IgniteCheckedException { - return getTestResources().getMarshaller().marshal(msg); + return marsh.marshal(msg); } /** @@ -1128,7 +1134,7 @@ public class GridNioSelfTest extends GridCommonAbstractTest { */ @SuppressWarnings({"RedundantTypeArguments"}) private <T> T deserializeMessage(byte[] data) throws IgniteCheckedException { - return getTestResources().getMarshaller().<T>unmarshal(data, getClass().getClassLoader()); + return marsh.<T>unmarshal(data, getClass().getClassLoader()); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39c7f542/modules/core/src/test/java/org/apache/ignite/marshaller/MarshallerContextTestImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/MarshallerContextTestImpl.java b/modules/core/src/test/java/org/apache/ignite/marshaller/MarshallerContextTestImpl.java index 095ee3f..594a022 100644 --- a/modules/core/src/test/java/org/apache/ignite/marshaller/MarshallerContextTestImpl.java +++ b/modules/core/src/test/java/org/apache/ignite/marshaller/MarshallerContextTestImpl.java @@ -18,9 +18,10 @@ package org.apache.ignite.marshaller; import org.apache.ignite.internal.util.typedef.internal.*; +import org.jdk8.backport.*; import java.io.*; -import java.util.*; +import java.util.concurrent.*; /** * Test marshaller context. @@ -30,7 +31,7 @@ public class MarshallerContextTestImpl implements MarshallerContext { private static final String CLS_NAMES_FILE = "org/apache/ignite/internal/classnames.properties"; /** */ - private final Map<Integer, Class> map = new HashMap<>(); + private final ConcurrentMap<Integer, Class> map = new ConcurrentHashMap8<>(); /** */ @@ -60,11 +61,19 @@ public class MarshallerContextTestImpl implements MarshallerContext { /** {@inheritDoc} */ @Override public void registerClass(int id, Class cls) { - map.put(id, cls); + Class old = map.putIfAbsent(id, cls); + + if (old != null && !cls.getName().equals(old.getName())) + throw new IllegalStateException("Collision [id=" + id + ", cls1=" + cls.getName() + + ", cls2=" + old.getName() + ']'); } /** {@inheritDoc} */ @Override public Class className(int id, ClassLoader ldr) throws ClassNotFoundException { - return map.get(id); + Class cls = map.get(id); + + assert cls != null; + + return cls; } }