This is an automated email from the ASF dual-hosted git repository.
korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new c0e290289d3 IGNITE-28493 Reduce contention in
RemotelyTriggeredResourceRegistry (#7960)
c0e290289d3 is described below
commit c0e290289d3cff6ff04a2645b2437db3e9740c55
Author: korlov42 <[email protected]>
AuthorDate: Tue Apr 14 10:30:47 2026 +0300
IGNITE-28493 Reduce contention in RemotelyTriggeredResourceRegistry (#7960)
---
.../internal/benchmark/SqlIndexScanBenchmark.java | 2 +-
.../benchmark/SqlIndexScanBenchmarkV2.java | 2 +-
.../sql/engine/exec/rel/IndexScanNode.java | 2 +-
.../tx/impl/RemotelyTriggeredResourceRegistry.java | 22 +++++++++-------------
4 files changed, 12 insertions(+), 16 deletions(-)
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmark.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmark.java
index 81d63cf6ccc..ad2b4dbaeb1 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmark.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmark.java
@@ -152,7 +152,7 @@ public class SqlIndexScanBenchmark extends
AbstractMultiNodeBenchmark {
*/
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
- .include(".*" + SqlIndexScanBenchmark.class.getSimpleName() +
".*")
+ .include(SqlIndexScanBenchmark.class.getName() + "\\..*")
.build();
new Runner(opt).run();
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmarkV2.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmarkV2.java
index 3c2d36b2645..649285b1e85 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmarkV2.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlIndexScanBenchmarkV2.java
@@ -129,7 +129,7 @@ public class SqlIndexScanBenchmarkV2 extends
AbstractMultiNodeBenchmark {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.addProfiler("gc")
- .include(".*" + SqlIndexScanBenchmarkV2.class.getSimpleName()
+ ".*")
+ .include(SqlIndexScanBenchmarkV2.class.getName() + "\\..*")
.build();
new Runner(opt).run();
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
index baee1191383..b245effe2b7 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
@@ -122,7 +122,7 @@ public class IndexScanNode<RowT> extends
StorageScanNode<RowT> {
int bufferSize = context().bufferSize();
// Let's prefetch equal share of a buffer from each partition.
- int fetchSize = max(context().bufferSize() /
partsWithConsistencyTokens.size(), 1);
+ int fetchSize = max(bufferSize / partsWithConsistencyTokens.size(), 1);
// Adds some buffer to improve chances to fulfill entire request
without need go to storage once again.
// This renders over-prefetching over all local partitions in total,
but at least it's capped now at
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/RemotelyTriggeredResourceRegistry.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/RemotelyTriggeredResourceRegistry.java
index b7d8064fbc1..8dfeac23404 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/RemotelyTriggeredResourceRegistry.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/RemotelyTriggeredResourceRegistry.java
@@ -163,23 +163,19 @@ public class RemotelyTriggeredResourceRegistry {
}
private void addRemoteHostResource(UUID remoteHostId,
FullyQualifiedResourceId resourceId) {
- remoteHostsToResources.compute(remoteHostId, (k, v) -> {
- if (v == null) {
- v = ConcurrentHashMap.newKeySet();
- }
-
- v.add(resourceId);
-
- return v;
- });
+ remoteHostsToResources.computeIfAbsent(remoteHostId, k ->
ConcurrentHashMap.newKeySet()).add(resourceId);
}
private void removeRemoteHostResource(UUID remoteHostId,
FullyQualifiedResourceId resourceId) {
- remoteHostsToResources.computeIfPresent(remoteHostId, (k, v) -> {
- v.remove(resourceId);
+ Set<FullyQualifiedResourceId> resources =
remoteHostsToResources.get(remoteHostId);
- return v.isEmpty() ? null : v;
- });
+ if (resources != null) {
+ resources.remove(resourceId);
+
+ if (resources.isEmpty()) {
+ remoteHostsToResources.computeIfPresent(remoteHostId, (k, v)
-> v.isEmpty() ? null : v);
+ }
+ }
}
private Map<FullyQualifiedResourceId, RemotelyTriggeredResource>
resources(UUID contextId) {