You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/03/14 13:45:54 UTC

(ignite-3) 02/02: Avoid boxing/unboxing in catalog module

This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-24805
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit ffec8f887cb711cd1faff00f59b58dbaab3d05dd
Author: amashenkov <am...@apache.org>
AuthorDate: Thu Mar 13 22:34:44 2025 +0300

    Avoid boxing/unboxing in catalog module
---
 .../compaction/CatalogCompactionRunner.java        | 61 ++++++++++++----------
 .../descriptors/CatalogTableDescriptor.java        |  7 ++-
 .../CatalogEntrySerializerProviderImpl.java        |  8 +--
 3 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/modules/catalog-compaction/src/main/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunner.java b/modules/catalog-compaction/src/main/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunner.java
index 669d4f29f82..badd708d267 100644
--- a/modules/catalog-compaction/src/main/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunner.java
+++ b/modules/catalog-compaction/src/main/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunner.java
@@ -25,11 +25,13 @@ import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import it.unimi.dsi.fastutil.ints.Int2IntMap;
 import it.unimi.dsi.fastutil.ints.Int2IntMap.Entry;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectIterator;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,6 +81,7 @@ import org.apache.ignite.internal.replicator.message.ReplicationGroupIdMessage;
 import org.apache.ignite.internal.schema.SchemaSyncService;
 import org.apache.ignite.internal.table.distributed.raft.MinimumRequiredTimeCollectorService;
 import org.apache.ignite.internal.tx.ActiveLocalTxMinimumRequiredTimeProvider;
+import org.apache.ignite.internal.util.CollectionUtils;
 import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.internal.util.Pair;
@@ -287,7 +290,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
                 chosenMinTime
         );
 
-        Map<Integer, BitSet> tableBitSet = buildTablePartitions(partitionStates);
+        Int2ObjectMap<BitSet> tableBitSet = buildTablePartitions(partitionStates);
 
         return new LocalMinTime(chosenMinTime, tableBitSet);
     }
@@ -297,14 +300,14 @@ public class CatalogCompactionRunner implements IgniteComponent {
 
         LocalMinTime localMinRequiredTime = getMinLocalTime(lwm);
         long localMinTime = localMinRequiredTime.time;
-        Map<Integer, BitSet> localPartitions = localMinRequiredTime.availablePartitions;
+        Int2ObjectMap<BitSet> localPartitions = localMinRequiredTime.availablePartitions;
 
         return determineGlobalMinimumRequiredTime(topologySnapshot.nodes(), localMinTime, localPartitions)
                 .thenComposeAsync(timeHolder -> {
 
                     long minRequiredTime = timeHolder.minRequiredTime;
                     long txMinRequiredTime = timeHolder.txMinRequiredTime;
-                    Map<String, Map<Integer, BitSet>> allPartitions = timeHolder.allPartitions;
+                    Map<String, Int2ObjectMap<BitSet>> allPartitions = timeHolder.allPartitions;
 
                     CompletableFuture<Boolean> catalogCompactionFut = tryCompactCatalog(
                             minRequiredTime,
@@ -335,13 +338,13 @@ public class CatalogCompactionRunner implements IgniteComponent {
             Collection<? extends ClusterNode> nodes,
             long localMinimumRequiredTime) {
 
-        return determineGlobalMinimumRequiredTime(nodes, localMinimumRequiredTime, Map.of());
+        return determineGlobalMinimumRequiredTime(nodes, localMinimumRequiredTime, Int2ObjectMaps.emptyMap());
     }
 
     private CompletableFuture<TimeHolder> determineGlobalMinimumRequiredTime(
             Collection<? extends ClusterNode> nodes,
             long localMinimumRequiredTime,
-            Map<Integer, BitSet> localPartitions
+            Int2ObjectMap<BitSet> localPartitions
     ) {
         CatalogCompactionMinimumTimesRequest request = COMPACTION_MESSAGES_FACTORY.catalogCompactionMinimumTimesRequest().build();
         List<CompletableFuture<Pair<String, CatalogCompactionMinimumTimesResponse>>> responseFutures = new ArrayList<>(nodes.size() - 1);
@@ -363,7 +366,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
                     long globalMinimumRequiredTime = localMinimumRequiredTime;
                     long globalMinimumTxRequiredTime = activeLocalTxMinimumRequiredTimeProvider.minimumRequiredTime();
 
-                    Map<String, Map<Integer, BitSet>> allPartitions = new HashMap<>();
+                    Map<String, Int2ObjectMap<BitSet>> allPartitions = new HashMap<>();
                     allPartitions.put(localNodeName, localPartitions);
 
                     for (CompletableFuture<Pair<String, CatalogCompactionMinimumTimesResponse>> fut : responseFutures) {
@@ -421,7 +424,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
             long minRequiredTime,
             LogicalTopologySnapshot topologySnapshot,
             HybridTimestamp lwm,
-            Map<String, Map<Integer, BitSet>> allPartitions
+            Map<String, Int2ObjectMap<BitSet>> allPartitions
     ) {
         Catalog catalog = catalogManagerFacade.catalogPriorToVersionAtTsNullable(minRequiredTime);
 
@@ -473,7 +476,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
     private CompletableFuture<Pair<Boolean, Set<String>>> validatePartitions(
             Catalog catalog,
             HybridTimestamp lwm,
-            Map<String, Map<Integer, BitSet>> allPartitions
+            Map<String, Int2ObjectMap<BitSet>> allPartitions
     ) {
         HybridTimestamp nowTs = clockService.now();
         ConcurrentHashMap<String, RequiredPartitions> requiredPartitionsPerNode = new ConcurrentHashMap<>();
@@ -493,19 +496,19 @@ public class CatalogCompactionRunner implements IgniteComponent {
             for (Map.Entry<String, RequiredPartitions> entry : requiredPartitionsPerNode.entrySet()) {
                 RequiredPartitions partitionsPerNode = entry.getValue();
                 String nodeId = entry.getKey();
-                Map<Integer, BitSet> actualPartitions = allPartitions.get(nodeId);
+                Int2ObjectMap<BitSet> actualPartitions = allPartitions.get(nodeId);
 
                 if (actualPartitions == null) {
                     return new Pair<>(false, requiredNodeNames);
                 }
 
-                Map<Integer, BitSet> requiredPartitions = partitionsPerNode.data();
+                Int2ObjectMap<BitSet> requiredPartitions = partitionsPerNode.data();
                 if (!actualPartitions.keySet().containsAll(requiredPartitions.keySet())) {
                     return new Pair<>(false, requiredNodeNames);
                 }
 
-                for (Map.Entry<Integer, BitSet> tableParts : requiredPartitions.entrySet()) {
-                    BitSet actual = actualPartitions.get(tableParts.getKey());
+                for (Int2ObjectMap.Entry<BitSet> tableParts : requiredPartitions.int2ObjectEntrySet()) {
+                    BitSet actual = actualPartitions.get(tableParts.getIntKey());
                     BitSet expected = tableParts.getValue();
 
                     BitSet cmp = (BitSet) actual.clone();
@@ -675,7 +678,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
             }
 
             long minRequiredTime = minLocalTime.time;
-            Map<Integer, BitSet> availablePartitions = minLocalTime.availablePartitions;
+            Int2ObjectMap<BitSet> availablePartitions = minLocalTime.availablePartitions;
 
             CatalogCompactionMinimumTimesResponse response = COMPACTION_MESSAGES_FACTORY.catalogCompactionMinimumTimesResponse()
                     .minimumRequiredTime(minRequiredTime)
@@ -698,8 +701,8 @@ public class CatalogCompactionRunner implements IgniteComponent {
         }
     }
 
-    private static Map<Integer, BitSet> buildTablePartitions(Map<TablePartitionId, @Nullable Long> tablePartitionMap) {
-        Map<Integer, BitSet> tableIdBitSet = new HashMap<>();
+    private static Int2ObjectMap<BitSet> buildTablePartitions(Map<TablePartitionId, @Nullable Long> tablePartitionMap) {
+        Int2ObjectMap<BitSet> tableIdBitSet = new Int2ObjectOpenHashMap<>();
 
         for (var e : tablePartitionMap.entrySet()) {
             TablePartitionId tp = e.getKey();
@@ -720,13 +723,14 @@ public class CatalogCompactionRunner implements IgniteComponent {
     }
 
     private static class LocalMinTime {
-        private static final LocalMinTime NOT_AVAILABLE = new LocalMinTime(HybridTimestamp.MIN_VALUE.longValue(), Collections.emptyMap());
+        private static final LocalMinTime NOT_AVAILABLE = new LocalMinTime(HybridTimestamp.MIN_VALUE.longValue(),
+                Int2ObjectMaps.emptyMap());
 
         final long time;
         // TableId to partition number(s).
-        final Map<Integer, BitSet> availablePartitions;
+        final Int2ObjectMap<BitSet> availablePartitions;
 
-        LocalMinTime(long time, Map<Integer, BitSet> availablePartitions) {
+        LocalMinTime(long time, Int2ObjectMap<BitSet> availablePartitions) {
             this.time = time;
             this.availablePartitions = availablePartitions;
         }
@@ -735,9 +739,9 @@ public class CatalogCompactionRunner implements IgniteComponent {
     static class TimeHolder {
         final long minRequiredTime;
         final long txMinRequiredTime;
-        final Map<String, Map<Integer, BitSet>> allPartitions;
+        final Map<String, Int2ObjectMap<BitSet>> allPartitions;
 
-        private TimeHolder(long minRequiredTime, long txMinRequiredTime, Map<String, Map<Integer, BitSet>> allPartitions) {
+        private TimeHolder(long minRequiredTime, long txMinRequiredTime, Map<String, Int2ObjectMap<BitSet>> allPartitions) {
             this.minRequiredTime = minRequiredTime;
             this.txMinRequiredTime = txMinRequiredTime;
             this.allPartitions = allPartitions;
@@ -745,7 +749,7 @@ public class CatalogCompactionRunner implements IgniteComponent {
     }
 
     private static class RequiredPartitions {
-        final Map<Integer, BitSet> partitions = new HashMap<>();
+        final Int2ObjectMap<BitSet> partitions = new Int2ObjectOpenHashMap<>();
 
         synchronized void update(int tableId, int p) {
             partitions.compute(tableId, (k, v) -> {
@@ -757,23 +761,22 @@ public class CatalogCompactionRunner implements IgniteComponent {
             });
         }
 
-        synchronized Map<Integer, BitSet> data() {
+        synchronized Int2ObjectMap<BitSet> data() {
             return partitions;
         }
     }
 
-    private static List<AvailablePartitionsMessage> availablePartitionsMessages(Map<Integer, BitSet> availablePartitions) {
-        return availablePartitions.entrySet().stream()
+    private static List<AvailablePartitionsMessage> availablePartitionsMessages(Int2ObjectMap<BitSet> availablePartitions) {
+        return availablePartitions.int2ObjectEntrySet().stream()
                 .map(e -> COMPACTION_MESSAGES_FACTORY.availablePartitionsMessage()
-                        .tableId(e.getKey())
+                        .tableId(e.getIntKey())
                         .partitions(e.getValue())
                         .build())
                 .collect(Collectors.toList());
     }
 
-    private static Map<Integer, BitSet> availablePartitionListToMap(List<AvailablePartitionsMessage> availablePartitions) {
+    private static Int2ObjectMap<BitSet> availablePartitionListToMap(List<AvailablePartitionsMessage> availablePartitions) {
         return availablePartitions.stream()
-                .map(a -> Map.entry(a.tableId(), a.partitions()))
-                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+                .collect(CollectionUtils.toIntMapCollector(AvailablePartitionsMessage::tableId, AvailablePartitionsMessage::partitions));
     }
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
index e27b9294b46..4bb93f2af40 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
@@ -23,7 +23,6 @@ import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectMap.BasicEntry;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Objects;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableSchemaVersions.TableVersion;
 import org.apache.ignite.internal.catalog.storage.serialization.MarshallableEntry;
@@ -232,7 +231,7 @@ public class CatalogTableDescriptor extends CatalogObjectDescriptor implements M
 
     /** Returns a column descriptor for column with given name, {@code null} if absent. */
     public @Nullable CatalogTableColumnDescriptor column(String name) {
-        Entry<Integer, CatalogTableColumnDescriptor> column = columnsMap.get(name);
+        Int2ObjectMap.Entry<CatalogTableColumnDescriptor> column = columnsMap.get(name);
         if (column != null) {
             return column.getValue();
         } else {
@@ -244,9 +243,9 @@ public class CatalogTableDescriptor extends CatalogObjectDescriptor implements M
      * Returns an index of a column with the given name, or {@code -1} if such column does not exist.
      */
     public int columnIndex(String name) {
-        Entry<Integer, CatalogTableColumnDescriptor> column = columnsMap.get(name);
+        Int2ObjectMap.Entry<CatalogTableColumnDescriptor> column = columnsMap.get(name);
         if (column != null) {
-            return column.getKey();
+            return column.getIntKey();
         } else {
             return -1;
         }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/serialization/CatalogEntrySerializerProviderImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/serialization/CatalogEntrySerializerProviderImpl.java
index d7e2be51e13..7557f27e136 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/serialization/CatalogEntrySerializerProviderImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/serialization/CatalogEntrySerializerProviderImpl.java
@@ -18,13 +18,13 @@
 package org.apache.ignite.internal.catalog.storage.serialization;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import org.apache.ignite.internal.lang.IgniteStringFormatter;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
@@ -180,13 +180,13 @@ class CatalogEntrySerializerProviderImpl implements CatalogEntrySerializerProvid
         }
 
         private static Int2ObjectMap<CatalogVersionAwareSerializer<? extends MarshallableEntry>[]> remapToOrderedArray(
-                Map<Integer, List<CatalogVersionAwareSerializer<? extends MarshallableEntry>>> mapByType) {
+                Int2ObjectMap<List<CatalogVersionAwareSerializer<? extends MarshallableEntry>>> mapByType) {
             Int2ObjectMap<CatalogVersionAwareSerializer<? extends MarshallableEntry>[]> result =
                     new Int2ObjectOpenHashMap<>(mapByType.size());
 
-            for (Map.Entry<Integer, List<CatalogVersionAwareSerializer<? extends MarshallableEntry>>> entry : mapByType.entrySet()) {
+            for (Entry<List<CatalogVersionAwareSerializer<? extends MarshallableEntry>>> entry : mapByType.int2ObjectEntrySet()) {
                 List<CatalogVersionAwareSerializer<? extends MarshallableEntry>> serializers = entry.getValue();
-                int typeId = entry.getKey();
+                int typeId = entry.getIntKey();
 
                 CatalogVersionAwareSerializer<? extends MarshallableEntry>[] orderedSerializers =
                         new CatalogVersionAwareSerializer[serializers.size()];