From b8e8af8e6d444627f21fe21a0c5891b3e1acbf03 Mon Sep 17 00:00:00 2001 From: zstan Date: Sun, 12 Nov 2023 20:36:17 +0300 Subject: [PATCH 01/16] IGNITE-20861 P2P prevent to load already deployed class from different node on SHARED mode --- .../GridDeploymentPerVersionStore.java | 36 ++++++- .../deployment/P2PClassLoadingIssues.java | 8 ++ .../datastreamer/DataStreamerUpdateJob.java | 5 +- .../jdk/JdkMarshallerObjectInputStream.java | 2 +- ...tomicEntryProcessorDeploymentSelfTest.java | 94 +++++++++++++++++++ .../ignite/p2p/SharedDeploymentTest.java | 2 +- ...eDeploymentEntryProcessorMultipleEnts.java | 51 ++++++++++ .../ignite/tests/p2p/cache/Container.java | 2 +- 8 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/CacheDeploymentEntryProcessorMultipleEnts.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 5c2e84112bc4f..cc82662119c04 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 @@ -128,6 +128,21 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { dep.removeParticipant(discoEvt.eventNode().id()); + if (dep.deployMode() == SHARED) { + dep.undeploy(); + + // Undeploy. + i2.remove(); + + assert !dep.isRemoved(); + + dep.onRemoved(); + + undeployed.add(dep); + + continue; + } + if (!dep.hasParticipants()) { if (dep.deployMode() == SHARED) { if (!dep.undeployed()) { @@ -322,13 +337,30 @@ else if (log.isDebugEnabled()) while (true) { List depsToCheck = null; - SharedDeployment dep = null; + SharedDeployment dep; synchronized (mux) { // Check obsolete request. if (isDeadClassLoader(meta)) return null; + Collection created = getDeployments(); + + // Check already exist deployment. + if (meta.deploymentMode() == SHARED) { + for (GridDeployment dep0 : created) { + // hot redeploy from same node + if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) + continue; + + IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); + + if (cls.getKey() != null && cls.getValue() == null) { + return dep0; + } + } + } + if (!F.isEmpty(meta.participants())) { Map participants = new LinkedHashMap<>(); @@ -1243,8 +1275,6 @@ void onRemoved() { /** {@inheritDoc} */ @Override public void onDeployed(Class cls) { - assert !Thread.holdsLock(mux); - boolean isTask = isTask(cls); String msg = (isTask ? "Task" : "Class") + " was deployed in SHARED or CONTINUOUS mode: " + cls; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java index efdeb0ae2c1d3..ec9cc81d9cba2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java @@ -38,6 +38,14 @@ public static T rethrowDisarmedP2PClassLoadingFailure(NoClassDefFoundError e throw error; } + /** Wraps specific exception. + * + * @param e Exception to be wrapped. + */ + public static P2PClassNotFoundException wrapWithP2PFailure(NoClassDefFoundError e) { + return new P2PClassNotFoundException("P2P class loading failed", e); + } + /** * Returns @{code true} if the given Throwable is an error caused by a P2P class-loading failure. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index ffe5b944d6f8e..e01c7430b0593 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -17,8 +17,11 @@ package org.apache.ignite.internal.processors.datastreamer; +import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; + import java.util.Collection; import java.util.Map; +import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues; @@ -146,7 +149,7 @@ class DataStreamerUpdateJob implements GridPlainCallable { return null; } catch (NoClassDefFoundError e) { - return P2PClassLoadingIssues.rethrowDisarmedP2PClassLoadingFailure(e); + throw wrapWithP2PFailure(e); } finally { if (ignoreDepOwnership) diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java index d9fdd3d2f1c3d..7e7c8f107e2c9 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java @@ -51,7 +51,7 @@ class JdkMarshallerObjectInputStream extends ObjectInputStream { } /** {@inheritDoc} */ - @Override protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + @Override protected Class resolveClass(ObjectStreamClass desc) throws ClassNotFoundException { // NOTE: DO NOT CHANGE TO 'clsLoader.loadClass()' // Must have 'Class.forName()' instead of clsLoader.loadClass() // due to weird ClassNotFoundExceptions for arrays of classes diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index f1128573c3e74..deb7cdddaa10e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.cache; +import java.util.HashMap; import java.util.Map; import java.util.TreeSet; import javax.cache.processor.EntryProcessorResult; @@ -27,12 +28,16 @@ import org.apache.ignite.configuration.DeploymentMode; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.config.GridTestProperties; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; import static org.apache.ignite.cache.CacheMode.PARTITIONED; +import static org.apache.ignite.cache.CacheMode.REPLICATED; import static org.apache.ignite.cache.CacheRebalanceMode.SYNC; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; @@ -116,6 +121,7 @@ public void testInvokeDeployment2() throws Exception { depMode = DeploymentMode.SHARED; doTestInvoke(); + doTestInvokeEx(); } /** @@ -168,6 +174,94 @@ private void doTestInvoke() throws Exception { } } + /** + * Scenario: 2 different client nodes invoke entry processors on intersected collection of keys. + * @throws Exception + */ + private void doTestInvokeEx() throws Exception { + String testCacheName = "dynamic_params"; + + String processorClassName = "org.apache.ignite.tests.p2p.CacheDeploymentEntryProcessorMultipleEnts"; + + String containerClassName = "org.apache.ignite.tests.p2p.cache.Container"; + + try { + startGrid(0); + IgniteEx cli1 = startClientGrid(1); + IgniteEx cli2 = startClientGrid(2); + + Class procCls1 = cli1.configuration().getClassLoader().loadClass(processorClassName); + Class procCls2 = cli2.configuration().getClassLoader().loadClass(processorClassName); + + Class contCls1 = cli1.configuration().getClassLoader().loadClass(containerClassName); + Class contCls2 = cli2.configuration().getClassLoader().loadClass(containerClassName); + + // just one more additional class unavailability check. + try { + Class.forName(TEST_VALUE); + fail(); + } + catch (ClassNotFoundException e) { + // No op. + } + + Class cacheValClazz = grid(2).configuration().getClassLoader().loadClass(TEST_VALUE); + Object cacheVal = cacheValClazz.newInstance(); + + CacheConfiguration ccfg = new CacheConfiguration<>(); + ccfg.setCacheMode(REPLICATED); + ccfg.setAtomicityMode(ATOMIC); + ccfg.setName(testCacheName); + + IgniteCache processedCache = cli1.createCache(ccfg); + + Map map = new HashMap<>(); + for (long i = 0; i < 100; i++) { + map.put(i, cacheVal); + } + + processedCache.putAll(map); + + IgniteCache cache1 = cli1.cache(testCacheName); + IgniteCache cache2 = cli2.cache(testCacheName); + + Object cont1 = contCls1.getDeclaredConstructor(Object.class).newInstance(map); + Object cont2 = contCls2.getDeclaredConstructor(Object.class).newInstance(map); + + for (int i = 0; i < 10; ++i) { + IgniteCache procCache1 = cache1; + IgniteInternalFuture f1 = GridTestUtils.runAsync(() -> { + for (long key = 0; key < 10; key++) { + procCache1.invoke(key, + (CacheEntryProcessor)procCls1.getDeclaredConstructor(Object.class).newInstance(cont1)); + } + }); + + IgniteCache procCache2 = cache2; + IgniteInternalFuture f2 = GridTestUtils.runAsync(() -> { + for (long key = 10; key > 0; key--) { + procCache2.invoke(key, + (CacheEntryProcessor)procCls2.getDeclaredConstructor(Object.class).newInstance(cont2)); + }; + }); + + f1.get(); + f2.get(); + + stopAllClients(true); + + cli1 = startClientGrid(1); + cli2 = startClientGrid(2); + + cache1 = cli1.cache(testCacheName); + cache2 = cli2.cache(testCacheName); + } + } + finally { + stopAllGrids(); + } + } + /** * @throws Exception In case of error. */ diff --git a/modules/core/src/test/java/org/apache/ignite/p2p/SharedDeploymentTest.java b/modules/core/src/test/java/org/apache/ignite/p2p/SharedDeploymentTest.java index 0d4b6ccb90372..51966fa93a97f 100644 --- a/modules/core/src/test/java/org/apache/ignite/p2p/SharedDeploymentTest.java +++ b/modules/core/src/test/java/org/apache/ignite/p2p/SharedDeploymentTest.java @@ -130,7 +130,7 @@ public void testLambdaDeploymentFromSecondAndThird() throws Exception { new URL(GridTestProperties.getProperty("p2p.uri.cls.second"))}), ignite3, 10_000); for (Object o: res) - assertEquals(o, 43); + assertEquals(43, o); } finally { stopAllGrids(); diff --git a/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/CacheDeploymentEntryProcessorMultipleEnts.java b/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/CacheDeploymentEntryProcessorMultipleEnts.java new file mode 100644 index 0000000000000..bdb16113bb05f --- /dev/null +++ b/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/CacheDeploymentEntryProcessorMultipleEnts.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.tests.p2p; + +import java.util.Map; +import javax.cache.processor.EntryProcessorException; +import javax.cache.processor.MutableEntry; +import org.apache.ignite.cache.CacheEntryProcessor; +import org.apache.ignite.tests.p2p.cache.Container; + +/** + * Entry processor for p2p tests. + */ +public class CacheDeploymentEntryProcessorMultipleEnts implements CacheEntryProcessor { + /** */ + private Map entToProcess; + + /** */ + public CacheDeploymentEntryProcessorMultipleEnts(Object container) { + entToProcess = (Map)((Container)container).field; + } + + /** {@inheritDoc} */ + @Override public Boolean process(MutableEntry entry, + Object... arguments) throws EntryProcessorException { + boolean pr = false; + + for (CacheDeploymentTestValue ent : entToProcess.values()) { + CacheDeploymentTestValue key = ent; + pr = key != null; + } + CacheDeploymentTestValue val = entry.getValue(); + + return pr; + } +} diff --git a/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/cache/Container.java b/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/cache/Container.java index fff36123f27f7..625890dcc6ae3 100644 --- a/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/cache/Container.java +++ b/modules/extdata/p2p/src/main/java/org/apache/ignite/tests/p2p/cache/Container.java @@ -20,7 +20,7 @@ /** */ public class Container { /** */ - private Object field; + public Object field; /** */ public Container(Object field) { From b2a2117396e34c33eebb105a2eadd0bd6bf646ea Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 27 Nov 2023 11:20:32 +0300 Subject: [PATCH 02/16] codestyle --- .../processors/datastreamer/DataStreamerUpdateJob.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index e01c7430b0593..b4a9bd0133b8f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -17,14 +17,10 @@ package org.apache.ignite.internal.processors.datastreamer; -import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; - import java.util.Collection; import java.util.Map; -import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; @@ -36,6 +32,8 @@ import org.apache.ignite.stream.StreamReceiver; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; + /** * Job to put entries to cache on affinity node. */ From 5626ff860f9ee449faa4255ff5fd2b1fde4d445d Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 28 Nov 2023 19:37:47 +0300 Subject: [PATCH 03/16] fix --- .../managers/deployment/GridDeploymentPerVersionStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cc82662119c04..194a172536db0 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 @@ -347,7 +347,7 @@ else if (log.isDebugEnabled()) Collection created = getDeployments(); // Check already exist deployment. - if (meta.deploymentMode() == SHARED) { + if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { for (GridDeployment dep0 : created) { // hot redeploy from same node if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) From 64d443927edbe9592dc0437a4daa99cc0b908219 Mon Sep 17 00:00:00 2001 From: zstan Date: Wed, 17 Jan 2024 16:26:50 +0300 Subject: [PATCH 04/16] flag NO CACHE --- .../GridDeploymentPerVersionStore.java | 17 +++++++++-------- ...GridNearAtomicSingleUpdateInvokeRequest.java | 6 +++++- .../ignite/internal/util/IgniteUtils.java | 4 +++- ...eAtomicEntryProcessorDeploymentSelfTest.java | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) 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 194a172536db0..ec2c7379bebed 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 @@ -129,16 +129,16 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { dep.removeParticipant(discoEvt.eventNode().id()); if (dep.deployMode() == SHARED) { - dep.undeploy(); + //dep.undeploy(); // Undeploy. - i2.remove(); + //i2.remove(); // !!! только это важно для теста testDeploymentFromSecondAndThird, кто дергает cache ?? - assert !dep.isRemoved(); + //assert !dep.isRemoved(); - dep.onRemoved(); + //dep.onRemoved(); - undeployed.add(dep); + //undeployed.add(dep); continue; } @@ -347,7 +347,7 @@ else if (log.isDebugEnabled()) Collection created = getDeployments(); // Check already exist deployment. - if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { +/* if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { for (GridDeployment dep0 : created) { // hot redeploy from same node if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) @@ -356,10 +356,11 @@ else if (log.isDebugEnabled()) IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); if (cls.getKey() != null && cls.getValue() == null) { - return dep0; + if (dep0.participants().keySet().contains(meta.senderNodeId())) + return dep0; } } - } + }*/ if (!F.isEmpty(meta.participants())) { Map participants = new LinkedHashMap<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java index c772be970032d..656755a134cea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java @@ -26,6 +26,7 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.internal.GridDirectTransient; +import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; @@ -193,8 +194,11 @@ public GridNearAtomicSingleUpdateInvokeRequest() { @Override public void finishUnmarshal(GridCacheSharedContext ctx, ClassLoader ldr) throws IgniteCheckedException { super.finishUnmarshal(ctx, ldr); - if (entryProcessorBytes != null && entryProcessor == null) + if (entryProcessorBytes != null && entryProcessor == null) { + GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE); entryProcessor = U.unmarshal(ctx, entryProcessorBytes, U.resolveClassLoader(ldr, ctx.gridConfig())); + GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE); + } if (invokeArgs == null) invokeArgs = unmarshalInvokeArguments(invokeArgsBytes, ctx, ldr); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index a344ee3d500c5..b2520da58fc88 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -10858,7 +10858,9 @@ public static T unmarshal(GridCacheSharedContext ctx, byte[] arr, @Nullable assert arr != null; try { - return U.unmarshal(ctx.marshaller(), arr, clsLdr); + //synchronized (mux) { + return U.unmarshal(ctx.marshaller(), arr, clsLdr); + //} } catch (IgniteCheckedException e) { throw e; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index deb7cdddaa10e..c123deb4aaa87 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -120,7 +120,7 @@ public void testInvokeDeployment() throws Exception { public void testInvokeDeployment2() throws Exception { depMode = DeploymentMode.SHARED; - doTestInvoke(); + //doTestInvoke(); doTestInvokeEx(); } From a5f16643c2b3f33d319a4aef1f6da486188fb1ea Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 23 Jan 2024 15:32:15 +0300 Subject: [PATCH 05/16] all tests done --- .../internal/binary/BinaryMarshaller.java | 2 +- .../GridDeploymentPerVersionStore.java | 22 ++++--------------- .../deployment/P2PClassLoadingIssues.java | 8 ------- ...idNearAtomicSingleUpdateInvokeRequest.java | 2 -- .../datastreamer/DataStreamerUpdateJob.java | 5 ++--- ...tomicEntryProcessorDeploymentSelfTest.java | 3 ++- 6 files changed, 9 insertions(+), 33 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java index 7db76c1ddabd9..21251db8572fd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java @@ -97,7 +97,7 @@ public void setBinaryContext(BinaryContext ctx, IgniteConfiguration cfg) { } /** {@inheritDoc} */ - @Override protected T unmarshal0(byte[] bytes, @Nullable ClassLoader clsLdr) throws IgniteCheckedException { + @Override protected T unmarshal0(byte[] bytes, @Nullable ClassLoader clsLdr) { return impl.deserialize(bytes, clsLdr); } 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 ec2c7379bebed..f551d648b6775 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 @@ -128,21 +128,6 @@ public class GridDeploymentPerVersionStore extends GridDeploymentStoreAdapter { dep.removeParticipant(discoEvt.eventNode().id()); - if (dep.deployMode() == SHARED) { - //dep.undeploy(); - - // Undeploy. - //i2.remove(); // !!! только это важно для теста testDeploymentFromSecondAndThird, кто дергает cache ?? - - //assert !dep.isRemoved(); - - //dep.onRemoved(); - - //undeployed.add(dep); - - continue; - } - if (!dep.hasParticipants()) { if (dep.deployMode() == SHARED) { if (!dep.undeployed()) { @@ -347,7 +332,7 @@ else if (log.isDebugEnabled()) Collection created = getDeployments(); // Check already exist deployment. -/* if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { + if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { for (GridDeployment dep0 : created) { // hot redeploy from same node if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) @@ -357,10 +342,11 @@ else if (log.isDebugEnabled()) if (cls.getKey() != null && cls.getValue() == null) { if (dep0.participants().keySet().contains(meta.senderNodeId())) - return dep0; + //return dep0; + addParticipant((SharedDeployment)dep0, meta); } } - }*/ + } if (!F.isEmpty(meta.participants())) { Map participants = new LinkedHashMap<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java index ec9cc81d9cba2..efdeb0ae2c1d3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java @@ -38,14 +38,6 @@ public static T rethrowDisarmedP2PClassLoadingFailure(NoClassDefFoundError e throw error; } - /** Wraps specific exception. - * - * @param e Exception to be wrapped. - */ - public static P2PClassNotFoundException wrapWithP2PFailure(NoClassDefFoundError e) { - return new P2PClassNotFoundException("P2P class loading failed", e); - } - /** * Returns @{code true} if the given Throwable is an error caused by a P2P class-loading failure. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java index 656755a134cea..fea545fb6cc7e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java @@ -195,9 +195,7 @@ public GridNearAtomicSingleUpdateInvokeRequest() { super.finishUnmarshal(ctx, ldr); if (entryProcessorBytes != null && entryProcessor == null) { - GridBinaryMarshaller.USE_CACHE.set(Boolean.FALSE); entryProcessor = U.unmarshal(ctx, entryProcessorBytes, U.resolveClassLoader(ldr, ctx.gridConfig())); - GridBinaryMarshaller.USE_CACHE.set(Boolean.TRUE); } if (invokeArgs == null) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index b4a9bd0133b8f..ffe5b944d6f8e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; @@ -32,8 +33,6 @@ import org.apache.ignite.stream.StreamReceiver; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; - /** * Job to put entries to cache on affinity node. */ @@ -147,7 +146,7 @@ class DataStreamerUpdateJob implements GridPlainCallable { return null; } catch (NoClassDefFoundError e) { - throw wrapWithP2PFailure(e); + return P2PClassLoadingIssues.rethrowDisarmedP2PClassLoadingFailure(e); } finally { if (ignoreDepOwnership) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index c123deb4aaa87..f51dc1e690e9d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; import javax.cache.processor.EntryProcessorResult; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheAtomicityMode; @@ -120,7 +121,7 @@ public void testInvokeDeployment() throws Exception { public void testInvokeDeployment2() throws Exception { depMode = DeploymentMode.SHARED; - //doTestInvoke(); + doTestInvoke(); doTestInvokeEx(); } From cd6723da8663bc2474c0f8eef5cd6daf6c64be39 Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 23 Jan 2024 18:27:02 +0300 Subject: [PATCH 06/16] fix --- .../GridNearAtomicSingleUpdateInvokeRequest.java | 1 - .../apache/ignite/internal/util/IgniteUtils.java | 4 +--- ...CacheAtomicEntryProcessorDeploymentSelfTest.java | 13 ++++++------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java index fea545fb6cc7e..104199c15353d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java @@ -26,7 +26,6 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.internal.GridDirectTransient; -import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index b2520da58fc88..a344ee3d500c5 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -10858,9 +10858,7 @@ public static T unmarshal(GridCacheSharedContext ctx, byte[] arr, @Nullable assert arr != null; try { - //synchronized (mux) { - return U.unmarshal(ctx.marshaller(), arr, clsLdr); - //} + return U.unmarshal(ctx.marshaller(), arr, clsLdr); } catch (IgniteCheckedException e) { throw e; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index f51dc1e690e9d..0aac3b0373c92 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.Map; import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; import javax.cache.processor.EntryProcessorResult; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheAtomicityMode; @@ -182,20 +181,20 @@ private void doTestInvoke() throws Exception { private void doTestInvokeEx() throws Exception { String testCacheName = "dynamic_params"; - String processorClassName = "org.apache.ignite.tests.p2p.CacheDeploymentEntryProcessorMultipleEnts"; + String prcClassName = "org.apache.ignite.tests.p2p.CacheDeploymentEntryProcessorMultipleEnts"; - String containerClassName = "org.apache.ignite.tests.p2p.cache.Container"; + String contClassName = "org.apache.ignite.tests.p2p.cache.Container"; try { startGrid(0); IgniteEx cli1 = startClientGrid(1); IgniteEx cli2 = startClientGrid(2); - Class procCls1 = cli1.configuration().getClassLoader().loadClass(processorClassName); - Class procCls2 = cli2.configuration().getClassLoader().loadClass(processorClassName); + Class procCls1 = cli1.configuration().getClassLoader().loadClass(prcClassName); + Class procCls2 = cli2.configuration().getClassLoader().loadClass(prcClassName); - Class contCls1 = cli1.configuration().getClassLoader().loadClass(containerClassName); - Class contCls2 = cli2.configuration().getClassLoader().loadClass(containerClassName); + Class contCls1 = cli1.configuration().getClassLoader().loadClass(contClassName); + Class contCls2 = cli2.configuration().getClassLoader().loadClass(contClassName); // just one more additional class unavailability check. try { From b36e0be4388f4b917012306265262465f9e3188e Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 23 Jan 2024 18:35:42 +0300 Subject: [PATCH 07/16] fix --- ...dCacheAtomicEntryProcessorDeploymentSelfTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index 0aac3b0373c92..af804d04b4ea7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -181,20 +181,20 @@ private void doTestInvoke() throws Exception { private void doTestInvokeEx() throws Exception { String testCacheName = "dynamic_params"; - String prcClassName = "org.apache.ignite.tests.p2p.CacheDeploymentEntryProcessorMultipleEnts"; + String prcClsName = "org.apache.ignite.tests.p2p.CacheDeploymentEntryProcessorMultipleEnts"; - String contClassName = "org.apache.ignite.tests.p2p.cache.Container"; + String contClsName = "org.apache.ignite.tests.p2p.cache.Container"; try { startGrid(0); IgniteEx cli1 = startClientGrid(1); IgniteEx cli2 = startClientGrid(2); - Class procCls1 = cli1.configuration().getClassLoader().loadClass(prcClassName); - Class procCls2 = cli2.configuration().getClassLoader().loadClass(prcClassName); + Class procCls1 = cli1.configuration().getClassLoader().loadClass(prcClsName); + Class procCls2 = cli2.configuration().getClassLoader().loadClass(prcClsName); - Class contCls1 = cli1.configuration().getClassLoader().loadClass(contClassName); - Class contCls2 = cli2.configuration().getClassLoader().loadClass(contClassName); + Class contCls1 = cli1.configuration().getClassLoader().loadClass(contClsName); + Class contCls2 = cli2.configuration().getClassLoader().loadClass(contClsName); // just one more additional class unavailability check. try { From 0111c04cca45302cbae5c57f72b55a7f2c59d7c1 Mon Sep 17 00:00:00 2001 From: zstan Date: Wed, 24 Jan 2024 15:37:44 +0300 Subject: [PATCH 08/16] fix --- .../deployment/GridDeploymentPerVersionStore.java | 11 ++--------- .../GridNearAtomicSingleUpdateInvokeRequest.java | 3 +-- ...idCacheAtomicEntryProcessorDeploymentSelfTest.java | 7 +++++-- 3 files changed, 8 insertions(+), 13 deletions(-) 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 f551d648b6775..c55b6a2ca3bc3 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 @@ -332,19 +332,12 @@ else if (log.isDebugEnabled()) Collection created = getDeployments(); // Check already exist deployment. - if (meta.deploymentMode() == SHARED && !ctx.security().sandbox().enabled()) { + if (meta.deploymentMode() == SHARED) { for (GridDeployment dep0 : created) { - // hot redeploy from same node - if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) - continue; - IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); - if (cls.getKey() != null && cls.getValue() == null) { - if (dep0.participants().keySet().contains(meta.senderNodeId())) - //return dep0; + if (cls.getKey() != null && cls.getValue() == null) addParticipant((SharedDeployment)dep0, meta); - } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java index 104199c15353d..c772be970032d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java @@ -193,9 +193,8 @@ public GridNearAtomicSingleUpdateInvokeRequest() { @Override public void finishUnmarshal(GridCacheSharedContext ctx, ClassLoader ldr) throws IgniteCheckedException { super.finishUnmarshal(ctx, ldr); - if (entryProcessorBytes != null && entryProcessor == null) { + if (entryProcessorBytes != null && entryProcessor == null) entryProcessor = U.unmarshal(ctx, entryProcessorBytes, U.resolveClassLoader(ldr, ctx.gridConfig())); - } if (invokeArgs == null) invokeArgs = unmarshalInvokeArguments(invokeArgsBytes, ctx, ldr); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java index af804d04b4ea7..2fe83283a4567 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAtomicEntryProcessorDeploymentSelfTest.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import java.util.TreeSet; +import java.util.concurrent.TimeUnit; import javax.cache.processor.EntryProcessorResult; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheAtomicityMode; @@ -245,8 +246,10 @@ private void doTestInvokeEx() throws Exception { }; }); - f1.get(); - f2.get(); + long duration = TimeUnit.SECONDS.toMillis(30); + + f1.get(duration); + f2.get(duration); stopAllClients(true); From 341ef07c02bd5944ede8d12159f311b14913b683 Mon Sep 17 00:00:00 2001 From: zstan Date: Wed, 24 Jan 2024 16:55:01 +0300 Subject: [PATCH 09/16] fix --- .../managers/deployment/GridDeploymentPerVersionStore.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 c55b6a2ca3bc3..69b652335e6db 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 @@ -334,10 +334,14 @@ else if (log.isDebugEnabled()) // Check already exist deployment. if (meta.deploymentMode() == SHARED) { for (GridDeployment dep0 : created) { + // hot redeploy from same node + if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) + continue; + IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); if (cls.getKey() != null && cls.getValue() == null) - addParticipant((SharedDeployment)dep0, meta); + addParticipant((SharedDeployment)dep0, meta); } } From bad33a2d030d29ed7ff5191753f32ef065b4b47f Mon Sep 17 00:00:00 2001 From: zstan Date: Thu, 1 Feb 2024 20:10:41 +0300 Subject: [PATCH 10/16] fix --- .../deployment/GridDeploymentPerVersionStore.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 69b652335e6db..233bff70167e1 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 @@ -331,6 +331,8 @@ else if (log.isDebugEnabled()) Collection created = getDeployments(); + boolean skipSearchDeployment = false; + // Check already exist deployment. if (meta.deploymentMode() == SHARED) { for (GridDeployment dep0 : created) { @@ -340,8 +342,10 @@ else if (log.isDebugEnabled()) IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); - if (cls.getKey() != null && cls.getValue() == null) - addParticipant((SharedDeployment)dep0, meta); + if (cls.getKey() != null && cls.getValue() == null) { + addParticipant((SharedDeployment) dep0, meta); + skipSearchDeployment = true; + } } } @@ -392,7 +396,10 @@ else if (ctx.discovery().node(meta.senderNodeId()) == null) { return null; } - dep = (SharedDeployment)searchDeploymentCache(meta); + if (!skipSearchDeployment) + dep = (SharedDeployment)searchDeploymentCache(meta); + else + dep = null; if (dep == null) { List deps = cache.get(meta.userVersion()); From 08436d0be8a92794c76230b1e4fe48449dd4f18c Mon Sep 17 00:00:00 2001 From: zstan Date: Fri, 2 Feb 2024 08:06:24 +0300 Subject: [PATCH 11/16] fix --- .../managers/deployment/GridDeploymentPerVersionStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 233bff70167e1..fe94c4c9958aa 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 @@ -343,7 +343,7 @@ else if (log.isDebugEnabled()) IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); if (cls.getKey() != null && cls.getValue() == null) { - addParticipant((SharedDeployment) dep0, meta); + addParticipant((SharedDeployment)dep0, meta); skipSearchDeployment = true; } } From 1e5548335d96868399d6e5f9be0ae5f425a8d96c Mon Sep 17 00:00:00 2001 From: zstan Date: Sat, 3 Feb 2024 20:39:47 +0300 Subject: [PATCH 12/16] fix --- .../deployment/P2PClassLoadingIssues.java | 8 ++++++ .../datastreamer/DataStreamerUpdateJob.java | 4 ++- .../p2p/GridP2PSameClassLoaderSelfTest.java | 25 ++++++------------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java index efdeb0ae2c1d3..ec9cc81d9cba2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/P2PClassLoadingIssues.java @@ -38,6 +38,14 @@ public static T rethrowDisarmedP2PClassLoadingFailure(NoClassDefFoundError e throw error; } + /** Wraps specific exception. + * + * @param e Exception to be wrapped. + */ + public static P2PClassNotFoundException wrapWithP2PFailure(NoClassDefFoundError e) { + return new P2PClassNotFoundException("P2P class loading failed", e); + } + /** * Returns @{code true} if the given Throwable is an error caused by a P2P class-loading failure. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index ffe5b944d6f8e..95aa3416e8acb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.processors.datastreamer; +import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; + import java.util.Collection; import java.util.Map; import org.apache.ignite.IgniteLogger; @@ -146,7 +148,7 @@ class DataStreamerUpdateJob implements GridPlainCallable { return null; } catch (NoClassDefFoundError e) { - return P2PClassLoadingIssues.rethrowDisarmedP2PClassLoadingFailure(e); + throw wrapWithP2PFailure(e); } finally { if (ignoreDepOwnership) diff --git a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java index 504b4d6e2069d..5000fe323a056 100644 --- a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java @@ -20,6 +20,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.util.UUID; import org.apache.ignite.Ignite; import org.apache.ignite.configuration.DeploymentMode; import org.apache.ignite.configuration.IgniteConfiguration; @@ -93,16 +94,18 @@ private void processTest() throws Exception { Class task1 = CLASS_LOADER.loadClass(TEST_TASK1_NAME); Class task2 = CLASS_LOADER.loadClass(TEST_TASK2_NAME); + UUID id = ignite2.cluster().localNode().id(); + // Execute task1 and task2 from node1 on node2 and make sure that they reuse same class loader on node2. - Integer res1 = (Integer)ignite1.compute().execute(task1, ignite2.cluster().localNode().id()); - Integer res2 = (Integer)ignite1.compute().execute(task2, ignite2.cluster().localNode().id()); + Integer res1 = (Integer)ignite1.compute().execute(task1, id); + Integer res2 = (Integer)ignite1.compute().execute(task2, id); assert res1.equals(res2); // Class loaders are same - Integer res3 = (Integer)ignite3.compute().execute(task1, ignite2.cluster().localNode().id()); - Integer res4 = (Integer)ignite3.compute().execute(task2, ignite2.cluster().localNode().id()); + Integer res3 = (Integer)ignite3.compute().execute(task1, id); + Integer res4 = (Integer)ignite3.compute().execute(task2, id); - assert res3.equals(res4); + assertEquals(res3, res4); } finally { stopGrid(1); @@ -147,18 +150,6 @@ public void testContinuousMode() throws Exception { processTest(); } - /** - * Test GridDeploymentMode.SHARED mode. - * - * @throws Exception if error occur. - */ - @Test - public void testSharedMode() throws Exception { - depMode = DeploymentMode.SHARED; - - processTest(); - } - /** * Return true if and only if all elements of array are different. * From 7fdad0601b25de77c71dc5b69678804df1878a93 Mon Sep 17 00:00:00 2001 From: zstan Date: Sun, 4 Feb 2024 13:09:26 +0300 Subject: [PATCH 13/16] fix --- .../internal/processors/datastreamer/DataStreamerUpdateJob.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index 95aa3416e8acb..0dd303bb19456 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -23,7 +23,6 @@ import java.util.Map; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; From c16aa9b885bbf7934fcefec2c1876d5ec251d324 Mon Sep 17 00:00:00 2001 From: zstan Date: Sun, 4 Feb 2024 13:19:02 +0300 Subject: [PATCH 14/16] fix --- .../processors/datastreamer/DataStreamerUpdateJob.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java index 0dd303bb19456..b4a9bd0133b8f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerUpdateJob.java @@ -17,8 +17,6 @@ package org.apache.ignite.internal.processors.datastreamer; -import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; - import java.util.Collection; import java.util.Map; import org.apache.ignite.IgniteLogger; @@ -34,6 +32,8 @@ import org.apache.ignite.stream.StreamReceiver; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.managers.deployment.P2PClassLoadingIssues.wrapWithP2PFailure; + /** * Job to put entries to cache on affinity node. */ From a0619dc9600ac39f6132f892db662f62424cc080 Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 9 Jul 2024 19:27:34 +0300 Subject: [PATCH 15/16] fix after review --- .../deployment/GridDeploymentPerVersionStore.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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 fe94c4c9958aa..a7dc8759b8c63 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 @@ -322,19 +322,19 @@ else if (log.isDebugEnabled()) while (true) { List depsToCheck = null; - SharedDeployment dep; + SharedDeployment dep = null; synchronized (mux) { // Check obsolete request. if (isDeadClassLoader(meta)) return null; - Collection created = getDeployments(); - boolean skipSearchDeployment = false; // Check already exist deployment. if (meta.deploymentMode() == SHARED) { + Collection created = getDeployments(); + for (GridDeployment dep0 : created) { // hot redeploy from same node if (dep0.participants().containsKey(meta.senderNodeId()) || dep0.undeployed()) @@ -398,8 +398,6 @@ else if (ctx.discovery().node(meta.senderNodeId()) == null) { if (!skipSearchDeployment) dep = (SharedDeployment)searchDeploymentCache(meta); - else - dep = null; if (dep == null) { List deps = cache.get(meta.userVersion()); From 34dada4e4b4b19eafce727df87a09e6e9bdf210d Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 9 Jul 2024 19:52:33 +0300 Subject: [PATCH 16/16] fix after review --- .../managers/deployment/GridDeploymentPerVersionStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a7dc8759b8c63..7c6c3246fd5ac 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 @@ -343,7 +343,7 @@ else if (log.isDebugEnabled()) IgniteBiTuple, Throwable> cls = dep0.deployedClass(meta.className(), meta.alias()); if (cls.getKey() != null && cls.getValue() == null) { - addParticipant((SharedDeployment)dep0, meta); + ((SharedDeployment)dep0).addParticipant(meta.senderNodeId(), meta.classLoaderId()); skipSearchDeployment = true; } }