# ignite-23
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e35e4ae9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e35e4ae9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e35e4ae9 Branch: refs/heads/ignite-929 Commit: e35e4ae97210891311a43c3b6640da537ba1fb2d Parents: 9f91e4d Author: sboikov <sboi...@gridgain.com> Authored: Wed May 27 13:51:19 2015 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Wed May 27 13:52:04 2015 +0300 ---------------------------------------------------------------------- .../processors/cache/GridCacheMvccManager.java | 32 ++++++++++++++++++-- .../GridDhtPartitionsExchangeFuture.java | 22 +++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e35e4ae9/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 c05e4b4..c528e08 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 @@ -955,6 +955,21 @@ public class GridCacheMvccManager extends GridCacheSharedManagerAdapter { } /** + * @param topVer Topology version. + * @return Locked keys. + */ + public Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> unfinishedLocks(AffinityTopologyVersion topVer) { + Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> cands = new HashMap<>(); + + for (FinishLockFuture fut : finishFuts) { + if (fut.topologyVersion().equals(topVer)) + cands.putAll(fut.pendingLocks()); + } + + return cands; + } + + /** * Creates a future that will wait for all explicit locks acquired on given topology * version to be released. * @@ -1041,8 +1056,7 @@ public class GridCacheMvccManager extends GridCacheSharedManagerAdapter { finishFuts.add(finishFut); finishFut.listen(new CI1<IgniteInternalFuture<?>>() { - @Override - public void apply(IgniteInternalFuture<?> e) { + @Override public void apply(IgniteInternalFuture<?> e) { finishFuts.remove(finishFut); // This call is required to make sure that the concurrent queue @@ -1117,6 +1131,20 @@ public class GridCacheMvccManager extends GridCacheSharedManagerAdapter { } /** + * @return Topology version. + */ + AffinityTopologyVersion topologyVersion() { + return topVer; + } + + /** + * @return Pending locks. + */ + Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> pendingLocks() { + return pendingLocks; + } + + /** * @return Filter. */ private IgnitePredicate<GridCacheMvccCandidate> versionFilter() { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e35e4ae9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 1c1ebd5..47bc1a3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -699,7 +699,27 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT if (exchId.isLeft()) cctx.mvcc().removeExplicitNodeLocks(exchId.nodeId(), exchId.topologyVersion()); - cctx.mvcc().finishLocks(exchId.topologyVersion()).get(); + IgniteInternalFuture<?> locksFut = cctx.mvcc().finishLocks(exchId.topologyVersion()); + + while (true) { + try { + locksFut.get(2 * cctx.gridConfig().getNetworkTimeout(), TimeUnit.MILLISECONDS); + + break; + } + catch (IgniteFutureTimeoutCheckedException ignored) { + U.warn(log, "Failed to wait for locks release future. " + + "Dumping pending objects that might be the cause: " + cctx.localNodeId()); + + U.warn(log, "Locked entries:"); + + Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> locks = + cctx.mvcc().unfinishedLocks(exchId.topologyVersion()); + + for (Map.Entry<IgniteTxKey, Collection<GridCacheMvccCandidate>> e : locks.entrySet()) + U.warn(log, "Locked entry [key=" + e.getKey() + ", mvcc=" + e.getValue() + ']'); + } + } for (GridCacheContext cacheCtx : cctx.cacheContexts()) { if (cacheCtx.isLocal())