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()];