You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/11/24 10:18:24 UTC

[13/50] [abbrv] ignite git commit: IGNITE-1282 - Fixed deadlock caused by listener notification from the synchronized block.

IGNITE-1282 - Fixed deadlock caused by listener notification from the synchronized block.


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

Branch: refs/heads/master
Commit: 70746cbd17b4c7b4e3e218d288d82b8f4546b568
Parents: a28649e
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Fri Nov 20 19:11:35 2015 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Nov 20 19:11:35 2015 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheMvccManager.java  | 29 ++++++++++++--------
 .../cache/transactions/IgniteTxEntry.java       |  3 ++
 2 files changed, 21 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/70746cbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManager.java
index 9104acb..2449df1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManager.java
@@ -141,18 +141,25 @@ public class GridCacheMvccManager extends GridCacheSharedManagerAdapter {
                 Collection<GridCacheMvccFuture<?>> futCol = mvccFuts.get(owner.version());
 
                 if (futCol != null) {
+                    ArrayList<GridCacheMvccFuture<?>> futColCp;
+
                     synchronized (futCol) {
-                        for (GridCacheMvccFuture<?> fut : futCol) {
-                            if (!fut.isDone()) {
-                                GridCacheMvccFuture<Boolean> mvccFut = (GridCacheMvccFuture<Boolean>)fut;
-
-                                // Since this method is called outside of entry synchronization,
-                                // we can safely invoke any method on the future.
-                                // Also note that we don't remove future here if it is done.
-                                // The removal is initiated from within future itself.
-                                if (mvccFut.onOwnerChanged(entry, owner))
-                                    return;
-                            }
+                        futColCp = new ArrayList<>(futCol.size());
+
+                        futColCp.addAll(futCol);
+                    }
+
+                    // Must invoke onOwnerChanged outside of synchronization block.
+                    for (GridCacheMvccFuture<?> fut : futColCp) {
+                        if (!fut.isDone()) {
+                            GridCacheMvccFuture<Boolean> mvccFut = (GridCacheMvccFuture<Boolean>)fut;
+
+                            // Since this method is called outside of entry synchronization,
+                            // we can safely invoke any method on the future.
+                            // Also note that we don't remove future here if it is done.
+                            // The removal is initiated from within future itself.
+                            if (mvccFut.onOwnerChanged(entry, owner))
+                                return;
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/70746cbd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
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 7436375..fba1513 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
@@ -839,6 +839,9 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
         if (this.ctx == null) {
             GridCacheContext<?, ?> cacheCtx = ctx.cacheContext(cacheId);
 
+            assert cacheCtx != null : "Failed to find cache context [cacheId=" + cacheId +
+                ", readyTopVer=" + ctx.exchange().readyAffinityVersion() + ']';
+
             if (cacheCtx.isNear() && !near)
                 cacheCtx = cacheCtx.near().dht().context();
             else if (!cacheCtx.isNear() && near)