Repository: ignite Updated Branches: refs/heads/ignite-9273 1040589a3 -> e96c06f32
IGNITE-9326 Fixed deferred serialization error handling for EntryProcessor result - Fixes #4588. Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f6234782 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f6234782 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f6234782 Branch: refs/heads/ignite-9273 Commit: f623478228f0000d7a88a56c3e280c7f97db858e Parents: 808d31f Author: Alexey Goncharuk <alexey.goncha...@gmail.com> Authored: Thu Aug 30 11:35:53 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Thu Aug 30 11:35:53 2018 +0300 ---------------------------------------------------------------------- .../cache/CacheInvokeDirectResult.java | 21 +++++++++++++++----- .../processors/cache/GridCacheReturn.java | 17 +++++++++++++++- .../dht/atomic/GridDhtAtomicCache.java | 4 ++++ .../IgniteCacheFailedUpdateResponseTest.java | 2 -- 4 files changed, 36 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/f6234782/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java index 89a0a0ff..3b463af 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java @@ -140,17 +140,28 @@ public class CacheInvokeDirectResult implements Message { } } - if (unprepareRes != null) { - res = ctx.toCacheObject(unprepareRes); - - unprepareRes = null; - } + assert unprepareRes == null : "marshalResult() was not called for the result: " + this; if (res != null) res.prepareMarshal(ctx.cacheObjectContext()); } /** + * Converts the entry processor unprepared result to a cache object instance. + * + * @param ctx Cache context. + */ + public void marshalResult(GridCacheContext ctx) { + try { + if (unprepareRes != null) + res = ctx.toCacheObject(unprepareRes); + } + finally { + unprepareRes = null; + } + } + + /** * @param ctx Cache context. * @param ldr Class loader. * @throws IgniteCheckedException If failed. http://git-wip-us.apache.org/repos/asf/ignite/blob/f6234782/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java index 530f5b6..2ae0f7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java @@ -269,7 +269,10 @@ public class GridCacheReturn implements Externalizable, Message { invokeResCol = new ArrayList<>(); CacheInvokeDirectResult res0 = err == null ? - CacheInvokeDirectResult.lazyResult(key, res) : new CacheInvokeDirectResult(key, err); + cctx.transactional() ? + new CacheInvokeDirectResult(key, cctx.toCacheObject(res)) : + CacheInvokeDirectResult.lazyResult(key, res) : + new CacheInvokeDirectResult(key, err); invokeResCol.add(res0); } @@ -308,6 +311,18 @@ public class GridCacheReturn implements Externalizable, Message { } /** + * Converts entry processor invokation results to cache object instances. + * + * @param ctx Cache context. + */ + public void marshalResult(GridCacheContext ctx) { + if (invokeRes && invokeResCol != null) { + for (CacheInvokeDirectResult directRes : invokeResCol) + directRes.marshalResult(ctx); + } + } + + /** * @param ctx Cache context. * @throws IgniteCheckedException If failed. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/f6234782/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java index 2e77b52..112b913 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java @@ -1787,6 +1787,10 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { top.readUnlock(); } + // This call will convert entry processor invocation results to cache object instances. + // Must be done outside topology read lock to avoid deadlocks. + res.returnValue().marshalResult(ctx); + break; } catch (UnregisteredClassException ex) { http://git-wip-us.apache.org/repos/asf/ignite/blob/f6234782/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheFailedUpdateResponseTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheFailedUpdateResponseTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheFailedUpdateResponseTest.java index bef33e8..ebcff7c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheFailedUpdateResponseTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheFailedUpdateResponseTest.java @@ -104,8 +104,6 @@ public class IgniteCacheFailedUpdateResponseTest extends GridCommonAbstractTest * @throws Exception If failed. */ public void testInvokeAtomic() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-9326"); - testInvoke(atomicCache); testInvokeAll(atomicCache); }