diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridEventConsumeHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/GridEventConsumeHandler.java index 599d301..9896b9c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridEventConsumeHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridEventConsumeHandler.java @@ -35,6 +35,7 @@ import org.apache.ignite.internal.managers.deployment.GridDeploymentInfo; import org.apache.ignite.internal.managers.deployment.GridDeploymentInfoBean; import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener; import org.apache.ignite.internal.processors.cache.GridCacheAdapter; +import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.GridCacheDeployable; import org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager; import org.apache.ignite.internal.processors.continuous.GridContinuousHandler; @@ -197,16 +198,16 @@ class GridEventConsumeHandler implements GridContinuousHandler { if (node == null) continue; - if (ctx.config().isPeerClassLoadingEnabled() - && ctx.discovery().cacheNode(node, cacheName)) { + GridCacheContext cctx = ctx.cache().internalCache( + cacheName).context(); + + if (cctx.deploymentEnabled() && + ctx.discovery().cacheNode(node, cacheName)) { wrapper.p2pMarshal(ctx.config().getMarshaller()); wrapper.cacheName = cacheName; - GridCacheDeploymentManager depMgr = ctx.cache() - .internalCache(cacheName).context().deploy(); - - depMgr.prepare(wrapper); + cctx.deploy().prepare(wrapper); } } @@ -519,4 +520,4 @@ class GridEventConsumeHandler implements GridContinuousHandler { evt = (Event)in.readObject(); } } -} \ No newline at end of file +} 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 420eea8..d095efb 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 @@ -39,7 +39,7 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; +import org.apache.ignite.marshaller.AbstractMarshaller; import org.apache.ignite.spi.IgniteSpiException; import org.apache.ignite.spi.deployment.DeploymentListener; import org.apache.ignite.spi.deployment.DeploymentResource; @@ -541,8 +541,8 @@ class GridDeploymentLocalStore extends GridDeploymentStoreAdapter { ctx.resource().onUndeployed(dep); // Clear optimized marshaller's cache. - if (ctx.config().getMarshaller() instanceof OptimizedMarshaller) - ((OptimizedMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); + if (ctx.config().getMarshaller() instanceof AbstractMarshaller) + ((AbstractMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); clearSerializationCaches(); @@ -572,4 +572,4 @@ class GridDeploymentLocalStore extends GridDeploymentStoreAdapter { undeploy(ldr); } } -} \ No newline at end of file +} 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 6ca74eb..4ba308c 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 @@ -39,7 +39,7 @@ import org.apache.ignite.internal.util.GridClassLoaderCache; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; +import org.apache.ignite.marshaller.AbstractMarshaller; import org.apache.ignite.spi.deployment.DeploymentSpi; import static org.apache.ignite.events.EventType.EVT_CLASS_DEPLOYED; @@ -511,8 +511,8 @@ public class GridDeploymentPerLoaderStore extends GridDeploymentStoreAdapter { ctx.cache().onUndeployed(ldr); // Clear optimized marshaller's cache. - if (ctx.config().getMarshaller() instanceof OptimizedMarshaller) - ((OptimizedMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); + if (ctx.config().getMarshaller() instanceof AbstractMarshaller) + ((AbstractMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); clearSerializationCaches(); @@ -527,4 +527,4 @@ public class GridDeploymentPerLoaderStore extends GridDeploymentStoreAdapter { return S.toString(IsolatedDeployment.class, this, super.toString()); } } -} \ No newline at end of file +} 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 6f9e968..fabbcb2 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 @@ -46,7 +46,7 @@ import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; +import org.apache.ignite.marshaller.AbstractMarshaller; import org.apache.ignite.spi.deployment.DeploymentSpi; import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; @@ -1281,8 +1281,8 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { ctx.cache().onUndeployed(ldr); // Clear optimized marshaller's cache. - if (ctx.config().getMarshaller() instanceof OptimizedMarshaller) - ((OptimizedMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); + if (ctx.config().getMarshaller() instanceof AbstractMarshaller) + ((AbstractMarshaller)ctx.config().getMarshaller()).onUndeploy(ldr); clearSerializationCaches(); @@ -1297,4 +1297,4 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { return S.toString(SharedDeployment.class, this, "super", super.toString()); } } -} \ No newline at end of file +} 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 2ee96b7..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 @@ -52,24 +52,25 @@ import java.util.jar.JarFile; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; +import org.apache.ignite.internal.portable.api.PortableException; +import org.apache.ignite.internal.portable.api.PortableIdMapper; +import org.apache.ignite.internal.portable.api.PortableInvalidClassException; +import org.apache.ignite.internal.portable.api.PortableMarshaller; +import org.apache.ignite.internal.portable.api.PortableMetadata; +import org.apache.ignite.internal.portable.api.PortableSerializer; +import org.apache.ignite.internal.portable.api.PortableTypeConfiguration; import org.apache.ignite.internal.processors.cache.portable.CacheObjectPortableProcessorImpl; +import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetConfiguration; +import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetPortableConfiguration; +import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetPortableTypeConfiguration; import org.apache.ignite.internal.util.GridConcurrentHashSet; +import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.lang.GridMapEntry; import org.apache.ignite.internal.util.typedef.T2; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.marshaller.MarshallerContext; import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; -import org.apache.ignite.internal.portable.api.PortableMarshaller; -import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetConfiguration; -import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetPortableConfiguration; -import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetPortableTypeConfiguration; -import org.apache.ignite.internal.portable.api.PortableException; -import org.apache.ignite.internal.portable.api.PortableIdMapper; -import org.apache.ignite.internal.portable.api.PortableInvalidClassException; -import org.apache.ignite.internal.portable.api.PortableMetadata; -import org.apache.ignite.internal.portable.api.PortableSerializer; -import org.apache.ignite.internal.portable.api.PortableTypeConfiguration; import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; @@ -81,6 +82,9 @@ public class PortableContext implements Externalizable { private static final long serialVersionUID = 0L; /** */ + private static final ClassLoader dfltLdr = U.gridClassLoader(); + + /** */ static final PortableIdMapper DFLT_ID_MAPPER = new IdMapperWrapper(null); /** */ @@ -108,8 +112,8 @@ public class PortableContext implements Externalizable { /** */ private final ConcurrentMap, PortableClassDescriptor> descByCls = new ConcurrentHashMap8<>(); - /** */ - private final ConcurrentMap userTypes = new ConcurrentHashMap8<>(0); + /** Holds classes loaded by default class loader only. */ + private final ConcurrentMap userTypes = new ConcurrentHashMap8<>(); /** */ private final Map predefinedTypes = new HashMap<>(); @@ -124,7 +128,7 @@ public class PortableContext implements Externalizable { private final Map, Byte> mapTypes = new HashMap<>(); /** */ - private final Map mappers = new ConcurrentHashMap8<>(0); + private final ConcurrentMap mappers = new ConcurrentHashMap8<>(0); /** */ private final Map typeMappers = new ConcurrentHashMap8<>(0); @@ -454,16 +458,18 @@ public class PortableContext implements Externalizable { public PortableClassDescriptor descriptorForTypeId(boolean userType, int typeId, ClassLoader ldr) { assert typeId != GridPortableMarshaller.UNREGISTERED_TYPE_ID; - //TODO: IGNITE-1358 (uncomment when fixed) - //PortableClassDescriptor desc = userType ? userTypes.get(typeId) : predefinedTypes.get(typeId); - - // As a workaround for IGNITE-1358 we always check the predefined map before. + //TODO: As a workaround for IGNITE-1358 we always check the predefined map before without checking 'userType' PortableClassDescriptor desc = predefinedTypes.get(typeId); if (desc != null) return desc; - if (userType) { + if (ldr == null) + ldr = dfltLdr; + + // 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 (desc != null) @@ -478,9 +484,17 @@ public class PortableContext implements Externalizable { desc = descByCls.get(cls); } catch (ClassNotFoundException e) { + // 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) { + // 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); } @@ -541,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); @@ -567,10 +581,15 @@ public class PortableContext implements Externalizable { false /* predefined */ ); - // perform put() instead of putIfAbsent() because "registered" flag may have been changed. - userTypes.put(typeId, desc); + // perform put() instead of putIfAbsent() because "registered" flag might have been changed or class loader + // might have reloaded described class. + 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)); @@ -620,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); } /** @@ -629,20 +648,20 @@ 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) return idMapper; - if (userTypes.containsKey(typeId) || predefinedTypes.containsKey(typeId)) + if (predefinedTypes.containsKey(typeId)) return DFLT_ID_MAPPER; return BASIC_CLS_ID_MAPPER; @@ -652,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; @@ -785,7 +804,9 @@ public class PortableContext implements Externalizable { fieldsMeta = desc.fieldsMeta(); - userTypes.put(id, desc); + if (IgniteUtils.detectClassLoader(cls).equals(dfltLdr)) + userTypes.put(id, desc); + descByCls.put(cls, desc); } @@ -934,6 +955,24 @@ public class PortableContext implements Externalizable { } /** + * Undeployment callback invoked when class loader is being undeployed. + * + * Some marshallers may want to clean their internal state that uses the undeployed class loader somehow. + * + * @param ldr Class loader being undeployed. + */ + public void onUndeploy(ClassLoader ldr) { + userTypes.remove(ldr); + + for (Class cls : descByCls.keySet()) { + if (ldr.equals(cls.getClassLoader())) + descByCls.remove(cls); + } + + U.clearClassCache(ldr); + } + + /** */ private static class IdMapperWrapper implements PortableIdMapper { /** */ @@ -1140,4 +1179,4 @@ public class PortableContext implements Externalizable { return registered; } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/api/PortableMarshaller.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/api/PortableMarshaller.java index de0df8d..2da4af1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/api/PortableMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/api/PortableMarshaller.java @@ -355,4 +355,9 @@ public class PortableMarshaller extends AbstractMarshaller { throw new PortableException("Failed to unmarshal the object from InputStream", e); } } + + /** {@inheritDoc} */ + @Override public void onUndeploy(ClassLoader ldr) { + impl.context().onUndeploy(ldr); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java index 7d7cbec..966cd61 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java @@ -44,21 +44,27 @@ public class CacheObjectContext { /** */ private boolean p2pEnabled; + /** */ + private boolean depEnabled; + /** * @param kernalCtx Kernal context. * @param dfltAffMapper Default affinity mapper. * @param cpyOnGet Copy on get flag. * @param storeVal {@code True} if should store unmarshalled value in cache. + * @param depEnabled {@code true} if deployment is enabled for the given cache. */ public CacheObjectContext(GridKernalContext kernalCtx, AffinityKeyMapper dfltAffMapper, boolean cpyOnGet, - boolean storeVal) { + boolean storeVal, + boolean depEnabled) { this.kernalCtx = kernalCtx; this.p2pEnabled = kernalCtx.config().isPeerClassLoadingEnabled(); this.dfltAffMapper = dfltAffMapper; this.cpyOnGet = cpyOnGet; this.storeVal = storeVal; + this.depEnabled = depEnabled; proc = kernalCtx.cacheObjects(); } @@ -71,6 +77,13 @@ public class CacheObjectContext { } /** + * @return {@code True} if deployment is enabled for the given cache. + */ + public boolean deploymentEnabled() { + return depEnabled; + } + + /** * @return Copy on get flag. */ public boolean copyOnGet() { @@ -126,4 +139,4 @@ public class CacheObjectContext { public Collection unwrapPortablesIfNeeded(Collection col, boolean keepPortable) { return col; } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java index 3a1cee6..e371079 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java @@ -236,6 +236,9 @@ public class GridCacheContext implements Externalizable { /** Updates allowed flag. */ private boolean updatesAllowed; + /** Deployment enabled flag for this specific cache */ + private boolean depEnabled; + /** * Empty constructor required for {@link Externalizable}. */ @@ -312,6 +315,7 @@ public class GridCacheContext implements Externalizable { this.cacheType = cacheType; this.affNode = affNode; this.updatesAllowed = updatesAllowed; + this.depEnabled = ctx.deploy().enabled() && !cacheObjects().isPortableEnabled(cacheCfg); /* * Managers in starting order! @@ -965,7 +969,7 @@ public class GridCacheContext implements Externalizable { * @return Cache transaction manager. */ public IgniteTxManager tm() { - return sharedCtx.tm(); + return sharedCtx.tm(); } /** @@ -1411,7 +1415,7 @@ public class GridCacheContext implements Externalizable { * @return {@code True} if deployment enabled. */ public boolean deploymentEnabled() { - return ctx.deploy().enabled(); + return depEnabled; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionRequest.java index fa0359c..4e0807a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionRequest.java @@ -82,15 +82,15 @@ public class GridCacheEvictionRequest extends GridCacheMessage implements GridCa super.prepareMarshal(ctx); if (entries != null) { - boolean depEnabled = ctx.deploymentEnabled(); - GridCacheContext cctx = ctx.cacheContext(cacheId); + boolean depEnabled = cctx.deploymentEnabled(); + for (CacheEvictionEntry e : entries) { e.prepareMarshal(cctx); if (depEnabled) - prepareObject(e.key().value(cctx.cacheObjectContext(), false), ctx); + prepareObject(e.key().value(cctx.cacheObjectContext(), false), cctx); } } } @@ -239,4 +239,4 @@ public class GridCacheEvictionRequest extends GridCacheMessage implements GridCa @Override public String toString() { return S.toString(GridCacheEvictionRequest.class, this); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java index c81dae5..90fd160 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java @@ -350,7 +350,8 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter { GridDhtTxPrepareResponse res = new GridDhtTxPrepareResponse( req.version(), req.futureId(), - req.miniId()); + req.miniId(), + req.deployInfo() != null); res.error(req.classError()); @@ -479,7 +480,8 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter { req.version(), null, null, - null); + null, + req.deployInfo() != null); res.error(req.classError()); @@ -545,8 +547,24 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter { if (destNodeId == null || !cctx.localNodeId().equals(destNodeId)) { msg.prepareMarshal(cctx); - if (depEnabled && msg instanceof GridCacheDeployable) - cctx.deploy().prepare((GridCacheDeployable)msg); + if (depEnabled) { + boolean depEnabled0; + + if (msg.deploymentEnabled() != null) + depEnabled0 = msg.deploymentEnabled(); + else { + GridCacheContext ctx = cctx.cacheContext(msg.cacheId()); + + if (ctx == null) + throw new IgniteCheckedException("Deployment related info is missing in message: [msg=" + + msg +']'); + + depEnabled0 = ctx.deploymentEnabled(); + } + + if (depEnabled0 && msg instanceof GridCacheDeployable) + cctx.deploy().prepare((GridCacheDeployable)msg); + } } return true; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java index 4b700e0..5347696 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java @@ -77,6 +77,13 @@ public abstract class GridCacheMessage implements Message { protected int cacheId; /** + * Deployment enabled flag indicates whether deployment info has to be added to this message. + * If the flag is not set use {@link GridCacheMessage#cacheId} to find out this information. + */ + @GridDirectTransient + protected Boolean depEnabled; + + /** * @return Error, if any. */ @Nullable public Throwable error() { @@ -174,11 +181,25 @@ public abstract class GridCacheMessage implements Message { } /** + * Deployment enabled flag indicates whether deployment info has to be added to this message. + * If the flag is not set use {@link #cacheId()} to find out this information. + * + * @return {@code true} or {@code false} if the deployment is enabled or disabled for all active caches involved + * in this message. Returns {@code null} if the flag hasn't been explicitly specified and {@link #cacheId()} has + * to be use to find out whether deployment is enabled for a cache or not. + */ + public Boolean deploymentEnabled() { + return depEnabled; + } + + /** * @param o Object to prepare for marshalling. * @param ctx Context. * @throws IgniteCheckedException If failed. */ - protected final void prepareObject(@Nullable Object o, GridCacheSharedContext ctx) throws IgniteCheckedException { + protected final void prepareObject(@Nullable Object o, GridCacheContext ctx) throws IgniteCheckedException { + assert ctx.deploymentEnabled(); + if (!skipPrepare && o != null) { GridDeploymentInfo d = ctx.deploy().globalDeploymentInfo(); @@ -261,14 +282,14 @@ public abstract class GridCacheMessage implements Message { if (ctx.deploymentEnabled()) { if (info.key() != null) - prepareObject(info.key().value(ctx.cacheObjectContext(), false), ctx.shared()); + prepareObject(info.key().value(ctx.cacheObjectContext(), false), ctx); CacheObject val = info.value(); if (val != null) { val.finishUnmarshal(ctx.cacheObjectContext(), ctx.deploy().globalLoader()); - prepareObject(CU.value(val, ctx, false), ctx.shared()); + prepareObject(CU.value(val, ctx, false), ctx); } } } @@ -336,14 +357,15 @@ public abstract class GridCacheMessage implements Message { for (IgniteTxEntry e : txEntries) { e.marshal(ctx, transferExpiry); - if (ctx.deploymentEnabled()) { - CacheObjectContext cctx =ctx.cacheContext(e.cacheId()).cacheObjectContext(); + GridCacheContext cctx = ctx.cacheContext(e.cacheId()); + + if (cctx.deploymentEnabled()) { if (e.key() != null) - prepareObject(e.key().value(cctx, false), ctx); + prepareObject(e.key().value(cctx.cacheObjectContext(), false), cctx); if (e.value() != null) - prepareObject(e.value().value(cctx, false), ctx); + prepareObject(e.value().value(cctx.cacheObjectContext(), false), cctx); } } } @@ -381,8 +403,8 @@ public abstract class GridCacheMessage implements Message { * @return Marshalled collection. * @throws IgniteCheckedException If failed. */ - @Nullable protected final byte[][] marshalInvokeArguments(@Nullable Object[] args, - GridCacheSharedContext ctx) throws IgniteCheckedException { + @Nullable protected final byte[][] marshalInvokeArguments(@Nullable Object[] args, GridCacheContext ctx) + throws IgniteCheckedException { assert ctx != null; if (args == null || args.length == 0) @@ -436,7 +458,7 @@ public abstract class GridCacheMessage implements Message { * @throws IgniteCheckedException If failed. */ @Nullable protected List marshalCollection(@Nullable Collection col, - GridCacheSharedContext ctx) throws IgniteCheckedException { + GridCacheContext ctx) throws IgniteCheckedException { assert ctx != null; if (col == null) @@ -476,7 +498,7 @@ public abstract class GridCacheMessage implements Message { obj.prepareMarshal(ctx.cacheObjectContext()); if (depEnabled) - prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx.shared()); + prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx); } } } @@ -498,7 +520,7 @@ public abstract class GridCacheMessage implements Message { obj.prepareMarshal(ctx.cacheObjectContext()); if (depEnabled) - prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx.shared()); + prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx); } } } @@ -649,4 +671,4 @@ public abstract class GridCacheMessage implements Message { @Override public String toString() { return S.toString(GridCacheMessage.class, this); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java index c5d4162..b37742c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java @@ -558,6 +558,9 @@ public class GridCacheSharedContext { if (store.isWriteBehind() != activeStore.isWriteBehind()) return "caches with different write-behind setting can't be enlisted in one transaction"; + if (activeCacheCtx.deploymentEnabled() != cacheCtx.deploymentEnabled()) + return "caches with enabled and disabled deployment modes can't be enlisted in one transaction"; + // If local and write-behind validations passed, this must be true. assert store.isWriteToStoreFromDht() == activeStore.isWriteToStoreFromDht(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java index 7854c93..df3b90d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java @@ -925,11 +925,25 @@ public class GridCacheUtils { * @throws IgniteCheckedException If marshalling failed. */ @SuppressWarnings("unchecked") - public static byte[] marshal(GridCacheSharedContext ctx, Object obj) + public static byte[] marshal(GridCacheContext ctx, Object obj) throws IgniteCheckedException { assert ctx != null; - if (ctx.gridDeploy().enabled()) { + return marshal(ctx.shared(), ctx.deploymentEnabled(), obj); + } + + /** + * @param ctx Cache context. + * @param depEnabled deployment enabled flag. + * @param obj Object to marshal. + * @return Buffer that contains obtained byte array. + * @throws IgniteCheckedException If marshalling failed. + */ + public static byte[] marshal(GridCacheSharedContext ctx, boolean depEnabled, Object obj) + throws IgniteCheckedException { + assert ctx != null; + + if (ctx.deploymentEnabled()) { if (obj != null) { if (obj instanceof Iterable) ctx.deploy().registerClasses((Iterable)obj); @@ -1797,4 +1811,4 @@ public class GridCacheUtils { } }; } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryRequest.java index bd6cd88..6efb27c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryRequest.java @@ -80,6 +80,7 @@ public class GridCacheTxRecoveryRequest extends GridDistributedBaseMessage { this.miniId = miniId; this.txNum = txNum; this.nearTxCheck = nearTxCheck; + this.depEnabled = tx.activeCachesDeploymentEnabled(); } /** @@ -258,4 +259,4 @@ public class GridCacheTxRecoveryRequest extends GridDistributedBaseMessage { @Override public String toString() { return S.toString(GridCacheTxRecoveryRequest.class, this, "super", super.toString()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryResponse.java index 8b9550f..af80c4f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryResponse.java @@ -64,6 +64,8 @@ public class GridCacheTxRecoveryResponse extends GridDistributedBaseMessage { this.futId = futId; this.miniId = miniId; this.success = success; + + this.depEnabled = false; } /** @@ -179,4 +181,4 @@ public class GridCacheTxRecoveryResponse extends GridDistributedBaseMessage { @Override public String toString() { return S.toString(GridCacheTxRecoveryResponse.class, this, "super", super.toString()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java index f969737..aa16a5f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java @@ -192,6 +192,11 @@ public class GridDistributedTxRemoteAdapter extends IgniteTxAdapter return Collections.emptyList(); } + /** {@inheritDoc} */ + @Nullable @Override public Boolean activeCachesDeploymentEnabled() { + return null; + } + /** * @return Checks if transaction has no entries. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java index 79bccc2..992bd66 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java @@ -320,7 +320,8 @@ public final class GridDhtTxFinishFuture extends GridCompoundIdentityFutur tx.pendingVersions(), tx.size(), tx.subjectId(), - tx.taskNameHash()); + tx.taskNameHash(), + tx.activeCachesDeploymentEnabled()); try { cctx.io().send(n, req, tx.ioPolicy()); @@ -397,7 +398,8 @@ public final class GridDhtTxFinishFuture extends GridCompoundIdentityFutur tx.pendingVersions(), tx.size(), tx.subjectId(), - tx.taskNameHash()); + tx.taskNameHash(), + tx.activeCachesDeploymentEnabled()); req.writeVersion(tx.writeVersion() != null ? tx.writeVersion() : tx.xidVersion()); @@ -450,7 +452,8 @@ public final class GridDhtTxFinishFuture extends GridCompoundIdentityFutur tx.pendingVersions(), tx.size(), tx.subjectId(), - tx.taskNameHash()); + tx.taskNameHash(), + tx.activeCachesDeploymentEnabled()); req.writeVersion(tx.writeVersion()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java index be59a95..5e9b2f1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java @@ -104,6 +104,7 @@ public class GridDhtTxFinishRequest extends GridDistributedTxFinishRequest { * @param txSize Expected transaction size. * @param subjId Subject ID. * @param taskNameHash Task name hash. + * @param depEnabled Deployment enabled flag. */ public GridDhtTxFinishRequest( UUID nearNodeId, @@ -127,7 +128,8 @@ public class GridDhtTxFinishRequest extends GridDistributedTxFinishRequest { Collection pendingVers, int txSize, @Nullable UUID subjId, - int taskNameHash + int taskNameHash, + boolean depEnabled ) { super( xidVer, @@ -157,6 +159,7 @@ public class GridDhtTxFinishRequest extends GridDistributedTxFinishRequest { this.sysInvalidate = sysInvalidate; this.subjId = subjId; this.taskNameHash = taskNameHash; + this.depEnabled = depEnabled; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java index ec0f234..9c78aeb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java @@ -61,13 +61,15 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse { * @param xid Xid version. * @param futId Future ID. * @param miniId Mini future ID. + * @param depEnabled Deployment enabled. */ - public GridDhtTxFinishResponse(GridCacheVersion xid, IgniteUuid futId, IgniteUuid miniId) { + public GridDhtTxFinishResponse(GridCacheVersion xid, IgniteUuid futId, IgniteUuid miniId, boolean depEnabled) { super(xid, futId); assert miniId != null; this.miniId = miniId; + this.depEnabled = depEnabled; } /** @@ -214,4 +216,4 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse { @Override public byte fieldsCount() { return 8; } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java index 761bbb0..a15a334 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java @@ -670,7 +670,8 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture extends GridCompoundIdentityFutu null, 0, null, - 0); + 0, + tx.activeCachesDeploymentEnabled()); finishReq.checkCommitted(true); @@ -574,7 +575,8 @@ public final class GridNearTxFinishFuture extends GridCompoundIdentityFutu null, tx.size(), tx.subjectId(), - tx.taskNameHash() + tx.taskNameHash(), + tx.activeCachesDeploymentEnabled() ); // If this is the primary node for the keys. @@ -764,4 +766,4 @@ public final class GridNearTxFinishFuture extends GridCompoundIdentityFutu return S.toString(MiniFuture.class, this, "done", isDone(), "cancelled", isCancelled(), "err", error()); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java index c52a127..afde904 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java @@ -77,6 +77,7 @@ public class GridNearTxFinishRequest extends GridDistributedTxFinishRequest { * @param committedVers Committed versions. * @param rolledbackVers Rolled back versions. * @param txSize Expected transaction size. + * @param depEnabled Deployment enabled. */ public GridNearTxFinishRequest( IgniteUuid futId, @@ -96,7 +97,8 @@ public class GridNearTxFinishRequest extends GridDistributedTxFinishRequest { Collection rolledbackVers, int txSize, @Nullable UUID subjId, - int taskNameHash) { + int taskNameHash, + boolean depEnabled) { super( xidVer, futId, @@ -119,6 +121,7 @@ public class GridNearTxFinishRequest extends GridDistributedTxFinishRequest { this.topVer = topVer; this.subjId = subjId; this.taskNameHash = taskNameHash; + this.depEnabled = depEnabled; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java index c860baa..4ede5ce 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java @@ -73,6 +73,8 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse { this.nearThreadId = nearThreadId; this.miniId = miniId; this.err = err; + + this.depEnabled = false; } /** {@inheritDoc} */ @@ -203,4 +205,4 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse { @Override public String toString() { return S.toString(GridNearTxFinishResponse.class, this, "super", super.toString()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java index 2b3ddff..012baa5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java @@ -142,6 +142,7 @@ public class GridNearTxPrepareRequest extends GridDistributedTxPrepareRequest { this.subjId = subjId; this.taskNameHash = taskNameHash; this.firstClientReq = firstClientReq; + this.depEnabled = tx.activeCachesDeploymentEnabled(); } /** @@ -492,4 +493,4 @@ public class GridNearTxPrepareRequest extends GridDistributedTxPrepareRequest { @Override public String toString() { return S.toString(GridNearTxPrepareRequest.class, this, super.toString()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java index 6558f97..f515303 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java @@ -115,6 +115,7 @@ public class GridNearTxPrepareResponse extends GridDistributedTxPrepareResponse * @param retVal Return value. * @param err Error. * @param clientRemapVer Not {@code null} if client node should remap transaction. + * @param depEnabled Deployment enabled. */ public GridNearTxPrepareResponse( GridCacheVersion xid, @@ -124,7 +125,8 @@ public class GridNearTxPrepareResponse extends GridDistributedTxPrepareResponse GridCacheVersion writeVer, GridCacheReturn retVal, Throwable err, - AffinityTopologyVersion clientRemapVer + AffinityTopologyVersion clientRemapVer, + boolean depEnabled ) { super(xid, err); @@ -138,6 +140,7 @@ public class GridNearTxPrepareResponse extends GridDistributedTxPrepareResponse this.writeVer = writeVer; this.retVal = retVal; this.clientRemapVer = clientRemapVer; + this.depEnabled = depEnabled; } /** @@ -543,4 +546,4 @@ public class GridNearTxPrepareResponse extends GridDistributedTxPrepareResponse return S.toString(GridNearTxPrepareResponse.class, this, "super", super.toString()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableContext.java index d064601..d5916e3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableContext.java @@ -41,13 +41,15 @@ public class CacheObjectPortableContext extends CacheObjectContext { * @param portableEnabled Portable enabled flag. * @param cpyOnGet Copy on get flag. * @param storeVal {@code True} if should store unmarshalled value in cache. + * @param depEnabled {@code true} if deployment is enabled for the given cache. */ public CacheObjectPortableContext(GridKernalContext kernalCtx, boolean cpyOnGet, boolean storeVal, - boolean portableEnabled) { + boolean portableEnabled, + boolean depEnabled) { super(kernalCtx, portableEnabled ? new CacheDefaultPortableAffinityKeyMapper() : - new GridCacheDefaultAffinityKeyMapper(), cpyOnGet, storeVal); + new GridCacheDefaultAffinityKeyMapper(), cpyOnGet, storeVal, depEnabled); this.portableEnabled = portableEnabled; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java index 4cab3db..29b2d46 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java @@ -704,7 +704,8 @@ public class CacheObjectPortableProcessorImpl extends IgniteCacheObjectProcessor CacheObjectContext res = new CacheObjectPortableContext(ctx, ctx0.copyOnGet(), ctx0.storeValue(), - portableEnabled); + portableEnabled, + ctx0.deploymentEnabled()); ctx.resource().injectGeneric(res.defaultAffMapper()); @@ -1022,4 +1023,4 @@ public class CacheObjectPortableProcessorImpl extends IgniteCacheObjectProcessor return S.toString(MetaDataPredicate.class, this); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java index c9ce933..e55f55c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java @@ -269,34 +269,36 @@ public class GridCacheQueryRequest extends GridCacheMessage implements GridCache @Override public void prepareMarshal(GridCacheSharedContext ctx) throws IgniteCheckedException { super.prepareMarshal(ctx); + GridCacheContext cctx = ctx.cacheContext(cacheId); + if (keyValFilter != null) { - if (ctx.deploymentEnabled()) - prepareObject(keyValFilter, ctx); + if (cctx.deploymentEnabled()) + prepareObject(keyValFilter, cctx); - keyValFilterBytes = CU.marshal(ctx, keyValFilter); + keyValFilterBytes = CU.marshal(cctx, keyValFilter); } if (rdc != null) { - if (ctx.deploymentEnabled()) - prepareObject(rdc, ctx); + if (cctx.deploymentEnabled()) + prepareObject(rdc, cctx); - rdcBytes = CU.marshal(ctx, rdc); + rdcBytes = CU.marshal(cctx, rdc); } if (trans != null) { - if (ctx.deploymentEnabled()) - prepareObject(trans, ctx); + if (cctx.deploymentEnabled()) + prepareObject(trans, cctx); - transBytes = CU.marshal(ctx, trans); + transBytes = CU.marshal(cctx, trans); } if (!F.isEmpty(args)) { - if (ctx.deploymentEnabled()) { + if (cctx.deploymentEnabled()) { for (Object arg : args) - prepareObject(arg, ctx); + prepareObject(arg, cctx); } - argsBytes = CU.marshal(ctx, args); + argsBytes = CU.marshal(cctx, args); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java index 78e2ac7..b994d78 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java @@ -25,6 +25,7 @@ import java.util.Map; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.GridDirectCollection; import org.apache.ignite.internal.GridDirectTransient; +import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.GridCacheDeployable; import org.apache.ignite.internal.processors.cache.GridCacheMessage; import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; @@ -114,19 +115,21 @@ public class GridCacheQueryResponse extends GridCacheMessage implements GridCach @Override public void prepareMarshal(GridCacheSharedContext ctx) throws IgniteCheckedException { super.prepareMarshal(ctx); + GridCacheContext cctx = ctx.cacheContext(cacheId); + if (err != null) errBytes = ctx.marshaller().marshal(err); - metaDataBytes = marshalCollection(metadata, ctx); - dataBytes = marshalCollection(data, ctx); + metaDataBytes = marshalCollection(metadata, cctx); + dataBytes = marshalCollection(data, cctx); - if (ctx.deploymentEnabled() && !F.isEmpty(data)) { + if (cctx.deploymentEnabled() && !F.isEmpty(data)) { for (Object o : data) { if (o instanceof Map.Entry) { Map.Entry e = (Map.Entry)o; - prepareObject(e.getKey(), ctx); - prepareObject(e.getValue(), ctx); + prepareObject(e.getKey(), cctx); + prepareObject(e.getValue(), cctx); } } } @@ -339,4 +342,4 @@ public class GridCacheQueryResponse extends GridCacheMessage implements GridCach @Override public String toString() { return S.toString(GridCacheQueryResponse.class, this); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java index 1990e18..e517c70 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java @@ -233,12 +233,10 @@ class CacheContinuousQueryHandler implements GridContinuousHandler { locLsnr.onUpdated(F.>asList(evt)); else { try { - if (ctx.config().isPeerClassLoadingEnabled() && ctx.discovery().node(nodeId) != null) { + if (cctx.deploymentEnabled() && ctx.discovery().node(nodeId) != null) { evt.entry().prepareMarshal(cctx); - GridCacheDeploymentManager depMgr = cctx.deploy(); - - depMgr.prepare(evt.entry()); + cctx.deploy().prepare(evt.entry()); } else evt.entry().prepareMarshal(cctx); @@ -551,4 +549,4 @@ class CacheContinuousQueryHandler implements GridContinuousHandler { depInfo = (GridDeploymentInfo)in.readObject(); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteInternalTx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteInternalTx.java index 11cd3fd..95e7f99 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteInternalTx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteInternalTx.java @@ -280,6 +280,12 @@ public interface IgniteInternalTx extends AutoCloseable, GridTimeoutObject { public Collection activeCacheIds(); /** + * @return {@code true} or {@code false} if the deployment is enabled or disabled for all active caches involved + * in this transaction. Returns {@code null} if there are no any active caches in the transaction yet. + */ + @Nullable public Boolean activeCachesDeploymentEnabled(); + + /** * Attempts to set topology version and returns the current value. * If topology version was previously set, then it's value will * be returned (but not updated). @@ -722,4 +728,4 @@ public interface IgniteInternalTx extends AutoCloseable, GridTimeoutObject { * @param topVer New topology version. */ public void onRemap(AffinityTopologyVersion topVer); -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java index 88752a2..2139696 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java @@ -1757,6 +1757,11 @@ public abstract class IgniteTxAdapter extends GridMetadataAwareAdapter } /** {@inheritDoc} */ + @Nullable @Override public Boolean activeCachesDeploymentEnabled() { + return null; + } + + /** {@inheritDoc} */ @Nullable @Override public Object addMeta(int key, Object val) { throw new IllegalStateException("Deserialized transaction can only be used as read-only."); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java index 3c33d19..c832ac8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java @@ -732,16 +732,18 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message { * @throws IgniteCheckedException If failed. */ public void marshal(GridCacheSharedContext ctx, boolean transferExpiry) throws IgniteCheckedException { + GridCacheContext cctx = ctx.cacheContext(cacheId); + if (filters != null) { for (CacheEntryPredicate p : filters) { if (p != null) - p.prepareMarshal(ctx.cacheContext(cacheId)); + p.prepareMarshal(cctx); } } // Do not serialize filters if they are null. if (transformClosBytes == null && entryProcessorsCol != null) - transformClosBytes = CU.marshal(ctx, entryProcessorsCol); + transformClosBytes = CU.marshal(cctx, entryProcessorsCol); if (transferExpiry) transferExpiryPlc = expiryPlc != null && expiryPlc != this.ctx.expiry(); @@ -750,7 +752,7 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message { val.marshal(ctx, context()); - expiryPlcBytes = transferExpiryPlc ? CU.marshal(ctx, new IgniteExternalizableExpiryPolicy(expiryPlc)) : null; + expiryPlcBytes = transferExpiryPlc ? CU.marshal(cctx, new IgniteExternalizableExpiryPolicy(expiryPlc)) : null; } /** @@ -1038,4 +1040,4 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message { return GridToStringBuilder.toString(IgniteTxEntry.class, this, "xidVer", tx == null ? "null" : tx.xidVersion()); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java index c2cc629..950bf01 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java @@ -241,7 +241,8 @@ public class IgniteTxHandler { req.version(), null, e, - null); + null, + req.deployInfo() != null); } } }); @@ -327,7 +328,8 @@ public class IgniteTxHandler { req.version(), null, null, - top.topologyVersion()); + top.topologyVersion(), + req.deployInfo() != null); try { ctx.io().send(nearNode, res, req.policy()); @@ -787,7 +789,7 @@ public class IgniteTxHandler { GridDhtTxPrepareResponse res; try { - res = new GridDhtTxPrepareResponse(req.version(), req.futureId(), req.miniId()); + res = new GridDhtTxPrepareResponse(req.version(), req.futureId(), req.miniId(), req.deployInfo() != null); // Start near transaction first. nearTx = !F.isEmpty(req.nearWrites()) ? startNearRemoteTx(ctx.deploy().globalLoader(), nodeId, req) : null; @@ -1053,7 +1055,8 @@ public class IgniteTxHandler { */ protected void sendReply(UUID nodeId, GridDhtTxFinishRequest req, boolean committed) { if (req.replyRequired()) { - GridDhtTxFinishResponse res = new GridDhtTxFinishResponse(req.version(), req.futureId(), req.miniId()); + GridDhtTxFinishResponse res = new GridDhtTxFinishResponse(req.version(), req.futureId(), req.miniId(), + req.deployInfo() != null); if (req.checkCommitted()) { res.checkCommitted(true); @@ -1382,4 +1385,4 @@ public class IgniteTxHandler { fut.onResult(nodeId, res); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java index aa0ffe8..24eefa2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java @@ -164,6 +164,9 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter /** Implicit transaction result. */ protected GridCacheReturn implicitRes; + /** Flag indicating whether deployment is enabled for caches from this transaction or not. */ + private Boolean depEnabled; + /** * Empty constructor required for {@link Externalizable}. */ @@ -276,6 +279,11 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter } /** {@inheritDoc} */ + @Nullable @Override public Boolean activeCachesDeploymentEnabled() { + return depEnabled; + } + + /** {@inheritDoc} */ @Override public boolean isStarted() { return txMap != null; } @@ -3234,6 +3242,9 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter } else activeCacheIds.add(cacheId); + + if (depEnabled == null) + depEnabled = cacheCtx.deploymentEnabled(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java index 6e7fadd..cca8b00 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java @@ -91,7 +91,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme /** {@inheritDoc} */ @Override public byte[] marshal(CacheObjectContext ctx, Object val) throws IgniteCheckedException { - return CU.marshal(ctx.kernalContext().cache().context(), val); + return CU.marshal(ctx.kernalContext().cache().context(), ctx.deploymentEnabled(), val); } /** {@inheritDoc} */ @@ -209,7 +209,8 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme CacheObjectContext res = new CacheObjectContext(ctx, ccfg.getAffinityMapper() != null ? ccfg.getAffinityMapper() : new GridCacheDefaultAffinityKeyMapper(), ccfg.isCopyOnRead() && memMode != OFFHEAP_VALUES, - storeVal); + storeVal, + ctx.config().isPeerClassLoadingEnabled() && !isPortableEnabled(ccfg)); ctx.resource().injectGeneric(res.defaultAffMapper()); @@ -392,4 +393,4 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme return new CacheObjectByteArrayImpl(valCpy); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java b/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java index 8c79a93..dd5bad0 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/AbstractMarshaller.java @@ -37,6 +37,16 @@ public abstract class AbstractMarshaller implements Marshaller { /** Context. */ protected MarshallerContext ctx; + + /** + * Undeployment callback invoked when class loader is being undeployed. + * + * Some marshallers may want to clean their internal state that uses the undeployed class loader somehow. + * + * @param ldr Class loader being undeployed. + */ + public abstract void onUndeploy(ClassLoader ldr); + /** {@inheritDoc} */ @Override public void setContext(MarshallerContext ctx) { this.ctx = ctx; @@ -71,4 +81,4 @@ public abstract class AbstractMarshaller implements Marshaller { U.close(in, null); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java b/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java index 0f4cf1f..9e0e823 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshaller.java @@ -115,7 +115,12 @@ public class JdkMarshaller extends AbstractMarshaller { } /** {@inheritDoc} */ + @Override public void onUndeploy(ClassLoader ldr) { + + } + + /** {@inheritDoc} */ @Override public String toString() { return S.toString(JdkMarshaller.class, this); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java index b9b782a..caccd99 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java @@ -288,7 +288,7 @@ public class OptimizedMarshaller extends AbstractMarshaller { * * @param ldr Class loader being undeployed. */ - public void onUndeploy(ClassLoader ldr) { + @Override public void onUndeploy(ClassLoader ldr) { for (Class cls : clsMap.keySet()) { if (ldr.equals(cls.getClassLoader())) clsMap.remove(cls); @@ -296,4 +296,4 @@ public class OptimizedMarshaller extends AbstractMarshaller { U.clearClassCache(ldr); } -} \ No newline at end of file +}