diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java index a9977164188b3..8f2ca5eb33aa7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java @@ -99,7 +99,7 @@ public class ClientConnectionContext extends ClientListenerAbstractConnectionCon private ClientRequestHandler handler; /** Handle registry. */ - private final ClientResourceRegistry resReg = new ClientResourceRegistry(); + private final ClientResourceRegistry resReg; /** Max cursors. */ private final int maxCursors; @@ -151,6 +151,7 @@ public ClientConnectionContext( this.maxCursors = maxCursors; maxActiveTxCnt = thinCfg.getMaxActiveTxPerConnection(); maxActiveComputeTasks = thinCfg.getMaxActiveComputeTasksPerConnection(); + resReg = new ClientResourceRegistry(ctx.log(ClientResourceRegistry.class)); } /** @@ -267,7 +268,7 @@ public void incrementCursors() { } /** - * Increments the cursor count. + * Decrement the cursor count. */ public void decrementCursors() { curCnt.decrementAndGet(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientResourceRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientResourceRegistry.java index edb2d4ddb85fa..4133ccec615ea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientResourceRegistry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientResourceRegistry.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import org.apache.ignite.IgniteLogger; /** * Per-connection resource registry. @@ -31,6 +32,17 @@ public class ClientResourceRegistry { /** ID generator. */ private final AtomicLong idGen = new AtomicLong(); + /** Logger. */ + private final IgniteLogger log; + + /** + * Logger for cleanup errors logging. + * @param log Logger. + */ + public ClientResourceRegistry(IgniteLogger log) { + this.log = log; + } + /** * Allocates server handle for an object. * @@ -85,8 +97,23 @@ public void release(long hnd) { * Cleans all handles and closes all ClientCloseableResources. */ public void clean() { - for (Map.Entry e : res.entrySet()) - closeIfNeeded(e.getValue()); + for (Map.Entry e : res.entrySet()) { + Long id = e.getKey(); + Object obj = e.getValue(); + + // Delete from registry before close, to avoid keeping references after clean. + res.remove(id, obj); + + try { + closeIfNeeded(obj); + } + catch (Exception ex) { + if (log != null && log.isDebugEnabled()) + log.debug("Failed to close client resource on disconnect [id=" + id + + ", res=" + obj + + ", err=" + ex.getClass().getSimpleName() + ": " + ex.getMessage() + ']'); + } + } } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheQueryContinuousHandle.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheQueryContinuousHandle.java index 127a3677fb887..16688829eb9bb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheQueryContinuousHandle.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheQueryContinuousHandle.java @@ -86,9 +86,12 @@ public void startNotifications(long id) { @Override public void close() { if (closeGuard.compareAndSet(false, true)) { assert cur != null; - cur.close(); - - ctx.decrementCursors(); + try { + cur.close(); + } + finally { + ctx.decrementCursors(); + } } } }