From ed05388691bb59482dc9415dc5478bcc5ec072b8 Mon Sep 17 00:00:00 2001 From: Kirill Anisimov Date: Thu, 5 Mar 2026 19:29:10 +0700 Subject: [PATCH 1/3] IGNITE-26959: Fix javadoc comment --- .../processors/platform/client/ClientConnectionContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..7cdf0603e44a4 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 @@ -267,7 +267,7 @@ public void incrementCursors() { } /** - * Increments the cursor count. + * Decrement the cursor count. */ public void decrementCursors() { curCnt.decrementAndGet(); From 307ab1f63df8c3bc73521c123c396c44f5c927ae Mon Sep 17 00:00:00 2001 From: Kirill Anisimov Date: Thu, 5 Mar 2026 19:38:57 +0700 Subject: [PATCH 2/3] IGNITE-26959: Make thin client resource cleanup resilient on disconnect --- .../client/ClientConnectionContext.java | 3 ++- .../client/ClientResourceRegistry.java | 27 +++++++++++++++++-- .../ClientCacheQueryContinuousHandle.java | 8 +++--- 3 files changed, 32 insertions(+), 6 deletions(-) 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 7cdf0603e44a4..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)); } /** 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..ee6790669c5eb 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,13 @@ public class ClientResourceRegistry { /** ID generator. */ private final AtomicLong idGen = new AtomicLong(); + /** Logger. */ + private final IgniteLogger log; + + public ClientResourceRegistry(IgniteLogger log) { + this.log = log; + } + /** * Allocates server handle for an object. * @@ -85,8 +93,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..77c7840c3a7f4 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,11 @@ 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(); + } } } } From afa24f1fafb35df8ee49e360261948ace15978a9 Mon Sep 17 00:00:00 2001 From: Kirill Anisimov Date: Fri, 6 Mar 2026 13:49:52 +0700 Subject: [PATCH 3/3] IGNITE-26959: Fix code style --- .../processors/platform/client/ClientResourceRegistry.java | 4 ++++ .../client/cache/ClientCacheQueryContinuousHandle.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) 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 ee6790669c5eb..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 @@ -35,6 +35,10 @@ public class ClientResourceRegistry { /** Logger. */ private final IgniteLogger log; + /** + * Logger for cleanup errors logging. + * @param log Logger. + */ public ClientResourceRegistry(IgniteLogger log) { this.log = log; } 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 77c7840c3a7f4..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 @@ -88,7 +88,8 @@ public void startNotifications(long id) { assert cur != null; try { cur.close(); - } finally { + } + finally { ctx.decrementCursors(); } }