You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sa...@apache.org on 2025/04/14 06:53:45 UTC
(ignite-3) branch main updated: IGNITE-25108 Fix several different tests in case of enabled colocation. (#5620)
This is an automated email from the ASF dual-hosted git repository.
sanpwc 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 f482713b336 IGNITE-25108 Fix several different tests in case of enabled colocation. (#5620)
f482713b336 is described below
commit f482713b336287900c866a12527f8ddc17342b44
Author: Alexander Lapin <la...@gmail.com>
AuthorDate: Mon Apr 14 09:53:39 2025 +0300
IGNITE-25108 Fix several different tests in case of enabled colocation. (#5620)
---
.../ignite/internal/table/ItEstimatedSizeTest.java | 2 +-
.../ignite/internal/index/IndexBuildController.java | 10 ++++++++++
.../internal/index/IndexManagementUtilsTest.java | 13 +++++++++----
.../raftsnapshot/ItTableRaftSnapshotsTest.java | 12 ++++++------
.../internal/ItTruncateRaftLogAndRestartNodesTest.java | 18 +++++++++---------
.../java/org/apache/ignite/internal/Cluster.java | 16 ++++++++++------
.../apache/ignite/internal/ReplicationGroupsUtils.java | 12 ++++++++++++
.../tx/distributed/ItTransactionPrimaryChangeTest.java | 12 ++++++++----
8 files changed, 65 insertions(+), 30 deletions(-)
diff --git a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/table/ItEstimatedSizeTest.java b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/table/ItEstimatedSizeTest.java
index 0f347ab4e3a..3a0eb8372e1 100644
--- a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/table/ItEstimatedSizeTest.java
+++ b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/table/ItEstimatedSizeTest.java
@@ -193,7 +193,7 @@ public class ItEstimatedSizeTest extends ClusterPerTestIntegrationTest {
if (enabledColocation()) {
return entriesFuture.join().stream()
- .filter(entry -> extractZonePartitionId(entry.key(), STABLE_ASSIGNMENTS_PREFIX_BYTES)
+ .filter(entry -> extractZonePartitionId(entry.key(), ZoneRebalanceUtil.STABLE_ASSIGNMENTS_PREFIX_BYTES)
.zoneId() == zoneId)
.map(entry -> Assignments.fromBytes(entry.value()))
.filter(Objects::nonNull)
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
index aeb6c436180..ba5e6c897f1 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
@@ -54,6 +54,8 @@ import org.apache.ignite.internal.failure.FailureProcessor;
import org.apache.ignite.internal.failure.FailureType;
import org.apache.ignite.internal.hlc.ClockService;
import org.apache.ignite.internal.hlc.HybridTimestamp;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
import org.apache.ignite.internal.network.ClusterService;
import org.apache.ignite.internal.placementdriver.PlacementDriver;
import org.apache.ignite.internal.placementdriver.PrimaryReplicaAwaitTimeoutException;
@@ -89,6 +91,8 @@ import org.apache.ignite.network.ClusterNode;
* node restart but after {@link ReplicaMeta#getExpirationTime()}.</p>
*/
class IndexBuildController implements ManuallyCloseable {
+ private static final IgniteLogger LOG = Loggers.forClass(IndexBuildController.class);
+
private final IndexBuilder indexBuilder;
private final IndexManager indexManager;
@@ -344,6 +348,9 @@ class IndexBuildController implements ManuallyCloseable {
) {
inBusyLock(busyLock, () -> {
if (isLeaseExpired(replicaMeta, buildAttemptTimestamp)) {
+ // TODO IGNITE-22522 Remove logging
+ LOG.info("Lease has expired (on new primary), stopping build index process [groupId={}, localNode={},"
+ + " primaryReplica={}.", primaryReplicaId, localNode(), replicaMeta);
stopBuildingIndexesIfPrimaryExpired(primaryReplicaId);
return;
@@ -397,6 +404,9 @@ class IndexBuildController implements ManuallyCloseable {
inBusyLock(busyLock, () -> {
if (isLeaseExpired(replicaMeta, buildAttemptTimestamp)) {
+ // TODO IGNITE-22522 Remove logging
+ LOG.info("Lease has expired, stopping build index process [groupId={}, localNode={}, primaryReplica={}.",
+ primaryReplicaId, localNode(), replicaMeta);
stopBuildingIndexesIfPrimaryExpired(primaryReplicaId);
return;
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagementUtilsTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagementUtilsTest.java
index a4a22713d3b..0496040e277 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagementUtilsTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagementUtilsTest.java
@@ -33,6 +33,7 @@ import static org.apache.ignite.internal.index.IndexManagementUtils.toPartitionB
import static org.apache.ignite.internal.index.TestIndexManagementUtils.LOCAL_NODE;
import static org.apache.ignite.internal.index.TestIndexManagementUtils.NODE_NAME;
import static org.apache.ignite.internal.index.TestIndexManagementUtils.newPrimaryReplicaMeta;
+import static org.apache.ignite.internal.lang.IgniteSystemProperties.enabledColocation;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -52,7 +53,9 @@ import org.apache.ignite.internal.network.ClusterNodeImpl;
import org.apache.ignite.internal.network.ClusterService;
import org.apache.ignite.internal.network.TopologyService;
import org.apache.ignite.internal.placementdriver.ReplicaMeta;
+import org.apache.ignite.internal.replicator.PartitionGroupId;
import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.replicator.ZonePartitionId;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.util.IgniteSpinBusyLock;
import org.apache.ignite.network.ClusterNode;
@@ -114,7 +117,9 @@ public class IndexManagementUtilsTest extends BaseIgniteAbstractTest {
@Test
void testIsPrimaryReplicaFalse() {
- TablePartitionId replicaGroupId = new TablePartitionId(1, 0);
+ PartitionGroupId groupId = enabledColocation()
+ ? new ZonePartitionId(0, 0)
+ : new TablePartitionId(1, 0);
ClusterNode otherNode = new ClusterNodeImpl(randomUUID(), NODE_NAME + "-other", mock(NetworkAddress.class));
@@ -125,9 +130,9 @@ public class IndexManagementUtilsTest extends BaseIgniteAbstractTest {
HybridTimestamp startTime0 = now;
HybridTimestamp startTime1 = now.addPhysicalTime(-dayInMillis);
- ReplicaMeta replicaMeta0 = newPrimaryReplicaMeta(otherNode, replicaGroupId, startTime0, startTime0.addPhysicalTime(dayInMillis));
- ReplicaMeta replicaMeta1 = newPrimaryReplicaMeta(LOCAL_NODE, replicaGroupId, startTime1, startTime1.addPhysicalTime(hourInMillis));
- ReplicaMeta replicaMeta2 = newPrimaryReplicaMeta(LOCAL_NODE, replicaGroupId, now, now);
+ ReplicaMeta replicaMeta0 = newPrimaryReplicaMeta(otherNode, groupId, startTime0, startTime0.addPhysicalTime(dayInMillis));
+ ReplicaMeta replicaMeta1 = newPrimaryReplicaMeta(LOCAL_NODE, groupId, startTime1, startTime1.addPhysicalTime(hourInMillis));
+ ReplicaMeta replicaMeta2 = newPrimaryReplicaMeta(LOCAL_NODE, groupId, now, now);
assertFalse(isPrimaryReplica(replicaMeta0, LOCAL_NODE, clock.now()));
assertFalse(isPrimaryReplica(replicaMeta1, LOCAL_NODE, clock.now()));
diff --git a/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java b/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
index b5e15b0ba33..c251e26b53d 100644
--- a/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
+++ b/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
@@ -72,7 +72,7 @@ import org.apache.ignite.internal.partition.replicator.raft.snapshot.incoming.In
import org.apache.ignite.internal.placementdriver.ReplicaMeta;
import org.apache.ignite.internal.raft.server.RaftServer;
import org.apache.ignite.internal.raft.server.impl.JraftServerImpl;
-import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.replicator.ReplicationGroupId;
import org.apache.ignite.internal.replicator.command.SafeTimeSyncCommand;
import org.apache.ignite.internal.storage.MvPartitionStorage;
import org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryStorageEngine;
@@ -388,19 +388,19 @@ class ItTableRaftSnapshotsTest extends ClusterPerTestIntegrationTest {
* Causes a RAFT snapshot to be taken on the RAFT leader of the sole table partition that exists in the cluster.
*/
private void doSnapshotOnSolePartitionLeader(int expectedLeaderNodeIndex, boolean forced) throws Exception {
- TablePartitionId tablePartitionId = cluster.solePartitionId();
+ ReplicationGroupId replicationGroupId = cluster.solePartitionId();
- doSnapshotOn(tablePartitionId, expectedLeaderNodeIndex, forced);
+ doSnapshotOn(replicationGroupId, expectedLeaderNodeIndex, forced);
}
/**
* Takes a RAFT snapshot on the leader of the RAFT group corresponding to the given table partition.
*/
- private void doSnapshotOn(TablePartitionId tablePartitionId, int expectedLeaderNodeIndex, boolean forced) throws Exception {
- RaftGroupService raftGroupService = cluster.leaderServiceFor(tablePartitionId);
+ private void doSnapshotOn(ReplicationGroupId replicationGroupId, int expectedLeaderNodeIndex, boolean forced) throws Exception {
+ RaftGroupService raftGroupService = cluster.leaderServiceFor(replicationGroupId);
assertThat(
- "Unexpected leadership change on group: " + tablePartitionId,
+ "Unexpected leadership change on group: " + replicationGroupId,
raftGroupService.getServerId().getConsistentId(), is(cluster.node(expectedLeaderNodeIndex).name())
);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItTruncateRaftLogAndRestartNodesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItTruncateRaftLogAndRestartNodesTest.java
index ef3112b8c62..f4ca3a0d2e8 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItTruncateRaftLogAndRestartNodesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItTruncateRaftLogAndRestartNodesTest.java
@@ -54,7 +54,7 @@ import org.apache.ignite.internal.manager.ComponentContext;
import org.apache.ignite.internal.raft.storage.LogStorageFactory;
import org.apache.ignite.internal.raft.storage.impl.IgniteJraftServiceFactory;
import org.apache.ignite.internal.raft.util.SharedLogStorageFactoryUtils;
-import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.replicator.ReplicationGroupId;
import org.apache.ignite.internal.schema.BinaryRow;
import org.apache.ignite.internal.schema.Column;
import org.apache.ignite.internal.schema.SchemaDescriptor;
@@ -169,14 +169,14 @@ public class ItTruncateRaftLogAndRestartNodesTest extends ClusterPerTestIntegrat
}
}
- private NodeImpl raftNodeImpl(int nodeIndex, TablePartitionId tablePartitionId) {
+ private NodeImpl raftNodeImpl(int nodeIndex, ReplicationGroupId replicationGroupId) {
NodeImpl[] node = {null};
igniteImpl(nodeIndex).raftManager().forEach((raftNodeId, raftGroupService) -> {
- if (tablePartitionId.equals(raftNodeId.groupId())) {
+ if (replicationGroupId.equals(raftNodeId.groupId())) {
assertNull(
node[0],
- String.format("NodeImpl already found: [nodeIndex=%s, tablePartitionId=%s]", nodeIndex, tablePartitionId)
+ String.format("NodeImpl already found: [nodeIndex=%s, replicationGroupId=%s]", nodeIndex, replicationGroupId)
);
node[0] = (NodeImpl) raftGroupService.getRaftNode();
@@ -185,7 +185,7 @@ public class ItTruncateRaftLogAndRestartNodesTest extends ClusterPerTestIntegrat
NodeImpl res = node[0];
- assertNotNull(res, String.format("Can't find NodeImpl: [nodeIndex=%s, tablePartitionId=%s]", nodeIndex, tablePartitionId));
+ assertNotNull(res, String.format("Can't find NodeImpl: [nodeIndex=%s, replicationGroupId=%s]", nodeIndex, replicationGroupId));
return res;
}
@@ -194,7 +194,7 @@ public class ItTruncateRaftLogAndRestartNodesTest extends ClusterPerTestIntegrat
* Creates and prepares {@link TestLogStorageFactory} for {@link TestLogStorageFactory#createLogStorage} creation after the
* corresponding node is stopped, so that there are no errors.
*/
- private TestLogStorageFactory createTestLogStorageFactory(int nodeIndex, TablePartitionId tablePartitionId) {
+ private TestLogStorageFactory createTestLogStorageFactory(int nodeIndex, ReplicationGroupId replicationGroupId) {
IgniteImpl ignite = igniteImpl(nodeIndex);
LogStorageFactory logStorageFactory = SharedLogStorageFactoryUtils.create(
@@ -202,16 +202,16 @@ public class ItTruncateRaftLogAndRestartNodesTest extends ClusterPerTestIntegrat
ignite.partitionsWorkDir().raftLogPath()
);
- NodeImpl nodeImpl = raftNodeImpl(nodeIndex, tablePartitionId);
+ NodeImpl nodeImpl = raftNodeImpl(nodeIndex, replicationGroupId);
return new TestLogStorageFactory(logStorageFactory, nodeImpl.getOptions(), nodeImpl.getRaftOptions());
}
- private void awaitMajority(TablePartitionId tablePartitionId) {
+ private void awaitMajority(ReplicationGroupId replicationGroupId) {
IgniteImpl ignite = unwrapIgniteImpl(cluster.aliveNode());
assertThat(
- ignite.placementDriver().awaitPrimaryReplica(tablePartitionId, ignite.clock().now(), 10, TimeUnit.SECONDS),
+ ignite.placementDriver().awaitPrimaryReplica(replicationGroupId, ignite.clock().now(), 10, TimeUnit.SECONDS),
willCompleteSuccessfully()
);
}
diff --git a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/Cluster.java b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/Cluster.java
index e0702dd193f..f58f09e4ffc 100644
--- a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/Cluster.java
+++ b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/Cluster.java
@@ -20,7 +20,10 @@ package org.apache.ignite.internal;
import static java.util.Collections.nCopies;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.ReplicationGroupsUtils.tablePartitionIds;
+import static org.apache.ignite.internal.ReplicationGroupsUtils.zonePartitionIds;
import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
+import static org.apache.ignite.internal.lang.IgniteSystemProperties.enabledColocation;
import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
@@ -61,7 +64,6 @@ import org.apache.ignite.internal.network.NetworkMessage;
import org.apache.ignite.internal.raft.RaftNodeId;
import org.apache.ignite.internal.raft.server.impl.JraftServerImpl;
import org.apache.ignite.internal.replicator.ReplicationGroupId;
-import org.apache.ignite.internal.replicator.TablePartitionId;
import org.apache.ignite.internal.testframework.TestIgnitionManager;
import org.apache.ignite.raft.jraft.RaftGroupService;
import org.apache.ignite.raft.jraft.Status;
@@ -709,15 +711,17 @@ public class Cluster {
}
/**
- * Returns the ID of the sole table partition that exists in the cluster or throws if there are less than one
+ * Returns the ID of the sole partition that exists in the cluster or throws if there are less than one
* or more than one partitions.
*/
- public TablePartitionId solePartitionId() {
- List<TablePartitionId> tablePartitionIds = ReplicationGroupsUtils.tablePartitionIds(unwrapIgniteImpl(aliveNode()));
+ public ReplicationGroupId solePartitionId() {
+ List<? extends ReplicationGroupId> replicationGroupIds = enabledColocation()
+ ? zonePartitionIds(unwrapIgniteImpl(aliveNode()))
+ : tablePartitionIds(unwrapIgniteImpl(aliveNode()));
- assertThat(tablePartitionIds.size(), is(1));
+ assertThat(replicationGroupIds.size(), is(1));
- return tablePartitionIds.get(0);
+ return replicationGroupIds.get(0);
}
/**
diff --git a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/ReplicationGroupsUtils.java b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/ReplicationGroupsUtils.java
index 56e667d2c1c..db2959fc5d5 100644
--- a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/ReplicationGroupsUtils.java
+++ b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/ReplicationGroupsUtils.java
@@ -23,6 +23,7 @@ import java.util.List;
import org.apache.ignite.internal.app.IgniteImpl;
import org.apache.ignite.internal.raft.RaftNodeId;
import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.replicator.ZonePartitionId;
/**
* Utilities used to obtain replication groups from a running Ignite instance.
@@ -38,4 +39,15 @@ public class ReplicationGroupsUtils {
.map(TablePartitionId.class::cast)
.collect(toList());
}
+
+ /**
+ * Returns the IDs of all zone partitions that exist on the given node.
+ */
+ public static List<ZonePartitionId> zonePartitionIds(IgniteImpl node) {
+ return node.raftManager().localNodes().stream()
+ .map(RaftNodeId::groupId)
+ .filter(ZonePartitionId.class::isInstance)
+ .map(ZonePartitionId.class::cast)
+ .collect(toList());
+ }
}
diff --git a/modules/transactions/src/integrationTest/java/org/apache/ignite/tx/distributed/ItTransactionPrimaryChangeTest.java b/modules/transactions/src/integrationTest/java/org/apache/ignite/tx/distributed/ItTransactionPrimaryChangeTest.java
index 9ddb2eae67f..0dff5a3a023 100644
--- a/modules/transactions/src/integrationTest/java/org/apache/ignite/tx/distributed/ItTransactionPrimaryChangeTest.java
+++ b/modules/transactions/src/integrationTest/java/org/apache/ignite/tx/distributed/ItTransactionPrimaryChangeTest.java
@@ -22,6 +22,7 @@ import static org.apache.ignite.internal.TestDefaultProfilesNames.DEFAULT_AIPERS
import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
import static org.apache.ignite.internal.TestWrappers.unwrapInternalTransaction;
import static org.apache.ignite.internal.TestWrappers.unwrapTableImpl;
+import static org.apache.ignite.internal.lang.IgniteSystemProperties.enabledColocation;
import static org.apache.ignite.internal.sql.engine.util.SqlTestUtils.executeUpdate;
import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
import static org.apache.ignite.internal.tx.test.ItTransactionTestUtils.waitAndGetPrimaryReplica;
@@ -37,6 +38,7 @@ import org.apache.ignite.internal.TestWrappers;
import org.apache.ignite.internal.app.IgniteImpl;
import org.apache.ignite.internal.partition.replicator.network.command.UpdateCommand;
import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.replicator.ZonePartitionId;
import org.apache.ignite.internal.table.NodeUtils;
import org.apache.ignite.internal.table.TableImpl;
import org.apache.ignite.raft.jraft.rpc.WriteActionRequest;
@@ -110,9 +112,11 @@ public class ItTransactionPrimaryChangeTest extends ClusterPerTestIntegrationTes
int partId = 0;
- var tblReplicationGrp = new TablePartitionId(tbl.tableId(), partId);
+ var replicationGrp = enabledColocation()
+ ? new ZonePartitionId(tbl.zoneId(), partId)
+ : new TablePartitionId(tbl.tableId(), partId);
- String leaseholder = waitAndGetPrimaryReplica(unwrapIgniteImpl(node(0)), tblReplicationGrp).getLeaseholder();
+ String leaseholder = waitAndGetPrimaryReplica(unwrapIgniteImpl(node(0)), replicationGrp).getLeaseholder();
IgniteImpl firstLeaseholderNode = findNodeByName(leaseholder);
@@ -137,7 +141,7 @@ public class ItTransactionPrimaryChangeTest extends ClusterPerTestIntegrationTes
if (msg instanceof WriteActionRequest) {
WriteActionRequest writeActionRequest = (WriteActionRequest) msg;
- if (tblReplicationGrp.toString().equals(writeActionRequest.groupId())
+ if (replicationGrp.toString().equals(writeActionRequest.groupId())
&& writeActionRequest.deserializedCommand() instanceof UpdateCommand
&& !fullTxReplicationAttemptFuture.isDone()) {
UpdateCommand updateCommand = (UpdateCommand) writeActionRequest.deserializedCommand();
@@ -165,7 +169,7 @@ public class ItTransactionPrimaryChangeTest extends ClusterPerTestIntegrationTes
// Changing the primary.
NodeUtils.transferPrimary(
cluster.runningNodes().map(TestWrappers::unwrapIgniteImpl).collect(toList()),
- tblReplicationGrp,
+ replicationGrp,
txCrdNode.name()
);