This is an automated email from the ASF dual-hosted git repository.
vpyatkov 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 d9c4e9c243 IGNITE-23124 Configurable deadlock prevention policies and
retry count after LockException (#4590)
d9c4e9c243 is described below
commit d9c4e9c2435d06eee6806057541cb2fdbf7fe5c0
Author: Denis Chudov <[email protected]>
AuthorDate: Fri Oct 25 11:06:50 2024 +0300
IGNITE-23124 Configurable deadlock prevention policies and retry count
after LockException (#4590)
---
.../ignite/client/fakes/FakeIgniteTables.java | 10 +-
.../ignite/internal/index/IndexManagerTest.java | 10 +-
.../ignite/internal/replicator/ReplicaService.java | 5 +-
.../ReplicationConfigurationSchema.java | 4 +
.../internal/benchmark/LockManagerBenchmark.java | 2 +
.../org/apache/ignite/internal/app/IgniteImpl.java | 8 +-
.../exec/ExecutableTableRegistrySelfTest.java | 10 +-
.../apache/ignite/distributed/ItLockTableTest.java | 4 +-
.../rebalance/ItRebalanceDistributedTest.java | 2 +-
.../ignite/internal/table/ItColocationTest.java | 10 +-
.../internal/table/InteropOperationsTest.java | 10 +-
.../internal/table/TableKvOperationsTestBase.java | 10 +-
.../table/distributed/SortedIndexLockerTest.java | 10 +-
.../PartitionReplicaListenerIndexLockingTest.java | 9 +-
...itionReplicaListenerSortedIndexLockingTest.java | 9 +-
.../replication/PartitionReplicaListenerTest.java | 9 +-
.../org/apache/ignite/internal/tx/LockManager.java | 7 ++
...adlockPreventionPolicyConfigurationSchema.java} | 25 ++--
.../TransactionConfigurationSchema.java | 4 +
.../tx/impl/DeadlockPreventionPolicyImpl.java | 92 +++++++++++++++
.../ignite/internal/tx/impl/HeapLockManager.java | 47 ++++----
.../ignite/internal/tx/impl/TxManagerImpl.java | 8 ++
.../tx/AbstractDeadlockPreventionTest.java | 3 +-
.../ignite/internal/tx/AbstractLockingTest.java | 7 ++
.../internal/tx/CoarseGrainedLockManagerTest.java | 8 +-
.../DeadlockPreventionPolicyConfigurationTest.java | 130 +++++++++++++++++++++
.../internal/tx/HeapLockManagerEventsTest.java | 2 +-
.../ignite/internal/tx/HeapLockManagerTest.java | 4 +-
.../internal/tx/NoWaitDeadlockPreventionTest.java | 12 +-
.../tx/ReversedDeadlockPreventionTest.java | 17 +--
.../internal/tx/TimeoutDeadlockPreventionTest.java | 9 +-
.../apache/ignite/internal/tx/TxManagerTest.java | 9 +-
.../internal/tx/impl/OrphanDetectorTest.java | 9 +-
33 files changed, 424 insertions(+), 91 deletions(-)
diff --git
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
index 20f4d38c2a..c3c062bcc2 100644
---
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
+++
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
@@ -39,7 +39,9 @@ import
org.apache.ignite.internal.table.StreamerReceiverRunner;
import org.apache.ignite.internal.table.TableImpl;
import org.apache.ignite.internal.table.TableViewInternal;
import org.apache.ignite.internal.table.distributed.schema.SchemaVersions;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.type.NativeTypes;
import org.apache.ignite.lang.IgniteException;
import org.apache.ignite.sql.IgniteSql;
@@ -226,7 +228,7 @@ public class FakeIgniteTables implements
IgniteTablesInternal {
return new TableImpl(
new FakeInternalTable(name, id, keyExtractor, compute,
placementDriver),
schemaReg,
- new HeapLockManager(),
+ lockManager(),
new SchemaVersions() {
@Override
public CompletableFuture<Integer>
schemaVersionAt(HybridTimestamp timestamp, int tableId) {
@@ -243,6 +245,12 @@ public class FakeIgniteTables implements
IgniteTablesInternal {
);
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
/**
* Gets the schema.
*
diff --git
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
index c67f6d3bb8..dc5e28a437 100644
---
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
+++
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
@@ -78,7 +78,9 @@ import
org.apache.ignite.internal.table.distributed.schema.ConstantSchemaVersion
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.testframework.WorkDirectory;
import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.sql.IgniteSql;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -202,7 +204,7 @@ public class IndexManagerTest extends
BaseIgniteAbstractTest {
return spy(new TableImpl(
internalTable,
- new HeapLockManager(),
+ lockManager(),
new ConstantSchemaVersions(1),
marshallers,
mock(IgniteSql.class),
@@ -210,6 +212,12 @@ public class IndexManagerTest extends
BaseIgniteAbstractTest {
));
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
private int tableId() {
return getTableIdStrict(catalogManager, TABLE_NAME, clock.nowLong());
}
diff --git
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaService.java
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaService.java
index b9c76dfeb6..6af9d8bc4a 100644
---
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaService.java
+++
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/ReplicaService.java
@@ -55,9 +55,6 @@ import org.jetbrains.annotations.TestOnly;
/** The service is intended to execute requests on replicas. */
public class ReplicaService {
- /** Retry timeout. */
- private static final int RETRY_TIMEOUT_MILLIS = 10;
-
/** Message service. */
private final MessagingService messagingService;
@@ -244,7 +241,7 @@ public class ReplicaService {
retryExecutor.schedule(
// Need to resubmit again to pool which is
valid for synchronous IO execution.
() ->
partitionOperationsExecutor.execute(() ->
res.completeExceptionally(errResp.throwable())),
- RETRY_TIMEOUT_MILLIS, MILLISECONDS);
+
replicationConfiguration.replicaOperationRetryInterval().value(), MILLISECONDS);
} else {
res.completeExceptionally(errResp.throwable());
}
diff --git
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationSchema.java
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationSchema.java
index 207d35af8b..de6316a2c6 100644
---
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationSchema.java
+++
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationSchema.java
@@ -50,4 +50,8 @@ public class ReplicationConfigurationSchema {
@Value(hasDefault = true)
@Range(min = 2000, max = 120000)
public long leaseExpirationInterval = 5_000;
+
+ @Value(hasDefault = true)
+ @Range(max = 10_000)
+ public int replicaOperationRetryInterval = 10;
}
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/LockManagerBenchmark.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/LockManagerBenchmark.java
index 1680ff2c34..33f948b1a4 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/LockManagerBenchmark.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/LockManagerBenchmark.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.LockMode;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.TransactionIdGenerator;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
@@ -60,6 +61,7 @@ public class LockManagerBenchmark {
@Setup
public void setUp() {
lockManager = new HeapLockManager();
+ ((HeapLockManager) lockManager).start(new
WaitDieDeadlockPreventionPolicy());
generator = new TransactionIdGenerator(0);
clock = new TestHybridClock(() -> 0L);
}
diff --git
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index ce579ed2ef..a23c6301cf 100644
---
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -591,8 +591,6 @@ public class IgniteImpl implements Ignite {
failureManager
);
- LockManager lockMgr = new HeapLockManager();
-
MessagingService messagingServiceReturningToStorageOperationsPool =
new JumpToExecutorByConsistentIdAfterSend(
clusterSvc.messagingService(),
name,
@@ -763,6 +761,8 @@ public class IgniteImpl implements Ignite {
replicationConfig
);
+ TransactionConfiguration txConfig =
clusterConfigRegistry.getConfiguration(TransactionExtensionConfiguration.KEY).transaction();
+
ReplicaService replicaSvc = new ReplicaService(
messagingServiceReturningToStorageOperationsPool,
clock,
@@ -893,8 +893,6 @@ public class IgniteImpl implements Ignite {
schemaSyncService
);
- TransactionConfiguration txConfig =
clusterConfigRegistry.getConfiguration(TransactionExtensionConfiguration.KEY).transaction();
-
indexNodeFinishedRwTransactionsChecker = new
IndexNodeFinishedRwTransactionsChecker(
catalogManager,
clusterSvc.messagingService(),
@@ -928,6 +926,8 @@ public class IgniteImpl implements Ignite {
var transactionInflights = new
TransactionInflights(placementDriverMgr.placementDriver(), clockService);
+ LockManager lockMgr = new HeapLockManager();
+
// TODO: IGNITE-19344 - use nodeId that is validated on join (and
probably generated differently).
txManager = new TxManagerImpl(
name,
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
index 1f9519384f..aabe02c006 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
@@ -46,7 +46,9 @@ import
org.apache.ignite.internal.table.distributed.TableManager;
import
org.apache.ignite.internal.table.distributed.schema.ConstantSchemaVersions;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.type.NativeTypes;
import org.apache.ignite.sql.IgniteSql;
import org.junit.jupiter.api.Test;
@@ -148,7 +150,7 @@ public class ExecutableTableRegistrySelfTest extends
BaseIgniteAbstractTest {
int schemaVersion = 1;
int tableVersion = 10;
- TableImpl table = new TableImpl(internalTable, schemaRegistry, new
HeapLockManager(), new ConstantSchemaVersions(tableVersion),
+ TableImpl table = new TableImpl(internalTable, schemaRegistry,
lockManager(), new ConstantSchemaVersions(tableVersion),
mock(IgniteSql.class), -1);
SchemaDescriptor schemaDescriptor = newDescriptor(schemaVersion);
@@ -167,5 +169,11 @@ public class ExecutableTableRegistrySelfTest extends
BaseIgniteAbstractTest {
return registry.getTable(schemaVersion, tableId);
}
+
+ private LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
}
}
diff --git
a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ItLockTableTest.java
b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ItLockTableTest.java
index ee48aa527b..e219facc70 100644
---
a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ItLockTableTest.java
+++
b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ItLockTableTest.java
@@ -40,7 +40,6 @@ import
org.apache.ignite.internal.schema.configuration.GcConfiguration;
import
org.apache.ignite.internal.schema.configuration.StorageUpdateConfiguration;
import org.apache.ignite.internal.table.TableViewInternal;
import org.apache.ignite.internal.testframework.IgniteAbstractTest;
-import org.apache.ignite.internal.tx.DeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.HybridTimestampTracker;
import org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
@@ -93,7 +92,7 @@ public class ItLockTableTest extends IgniteAbstractTest {
@InjectConfiguration
protected static GcConfiguration gcConfig;
- @InjectConfiguration
+ @InjectConfiguration("mock: { deadlockPreventionPolicy: { waitTimeout: -1,
txIdComparator: NONE } }")
protected static TransactionConfiguration txConfiguration;
@InjectConfiguration
@@ -146,7 +145,6 @@ public class ItLockTableTest extends IgniteAbstractTest {
clusterService,
replicaSvc,
new HeapLockManager(
- DeadlockPreventionPolicy.NO_OP,
HeapLockManager.SLOTS,
CACHE_SIZE),
clockService,
diff --git
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
index aba421593c..3eb2f64b2e 100644
---
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
+++
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
@@ -1043,7 +1043,7 @@ public class ItRebalanceDistributedTest extends
BaseIgniteAbstractTest {
private final ClusterService clusterService;
- private final LockManager lockManager;
+ private final HeapLockManager lockManager;
private final TxManager txManager;
diff --git
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
index fc12949c07..de0e2e1a4b 100644
---
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
+++
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
@@ -96,6 +96,7 @@ import
org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.tx.HybridTimestampTracker;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.TxManager;
import org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
@@ -103,6 +104,7 @@ import
org.apache.ignite.internal.tx.impl.RemotelyTriggeredResourceRegistry;
import org.apache.ignite.internal.tx.impl.TransactionIdGenerator;
import org.apache.ignite.internal.tx.impl.TransactionInflights;
import org.apache.ignite.internal.tx.impl.TxManagerImpl;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import
org.apache.ignite.internal.tx.storage.state.test.TestTxStateTableStorage;
import org.apache.ignite.internal.tx.test.TestLocalRwTxCounter;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
@@ -404,11 +406,17 @@ public class ItColocationTest extends
BaseIgniteAbstractTest {
schemaRegistry = new DummySchemaManagerImpl(schema);
- tbl = new TableImpl(intTable, schemaRegistry, new HeapLockManager(),
new ConstantSchemaVersions(1), mock(IgniteSql.class), -1);
+ tbl = new TableImpl(intTable, schemaRegistry, lockManager(), new
ConstantSchemaVersions(1), mock(IgniteSql.class), -1);
marshaller = new TupleMarshallerImpl(schema);
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
private Tuple createTuple(int k, NativeTypeSpec t0, NativeTypeSpec t1) {
return Tuple.create()
.set("ID", 1L)
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/InteropOperationsTest.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/InteropOperationsTest.java
index c22651a030..0c7404a250 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/InteropOperationsTest.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/InteropOperationsTest.java
@@ -53,8 +53,10 @@ import
org.apache.ignite.internal.table.distributed.schema.SchemaVersions;
import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.type.NativeType;
import org.apache.ignite.internal.type.NativeTypes;
import org.apache.ignite.sql.IgniteSql;
@@ -140,7 +142,7 @@ public class InteropOperationsTest extends
BaseIgniteAbstractTest {
SchemaVersions schemaVersions = new
ConstantSchemaVersions(schemaVersion);
- table = new TableImpl(intTable, schemaRegistry, new HeapLockManager(),
schemaVersions, mock(IgniteSql.class), -1);
+ table = new TableImpl(intTable, schemaRegistry, lockManager(),
schemaVersions, mock(IgniteSql.class), -1);
kvBinView = table.keyValueView();
kvView = table.keyValueView(Mapper.of(Long.class, "id"),
Mapper.of(Value.class));
@@ -148,6 +150,12 @@ public class InteropOperationsTest extends
BaseIgniteAbstractTest {
rView = table.recordView(Mapper.of(Row.class));
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
/**
* Validate all types are tested.
*/
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/TableKvOperationsTestBase.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/TableKvOperationsTestBase.java
index 8f80e343c9..e7669244d2 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/TableKvOperationsTestBase.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/TableKvOperationsTestBase.java
@@ -33,8 +33,10 @@ import
org.apache.ignite.internal.table.distributed.schema.SchemaVersions;
import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.sql.IgniteSql;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
@@ -70,13 +72,19 @@ abstract class TableKvOperationsTestBase extends
BaseIgniteAbstractTest {
return new TableImpl(
internalTable,
new DummySchemaManagerImpl(schema),
- new HeapLockManager(),
+ lockManager(),
schemaVersions,
mock(IgniteSql.class),
-1
);
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
protected final DummyInternalTableImpl
createInternalTable(SchemaDescriptor schema) {
return new DummyInternalTableImpl(replicaService, schema,
txConfiguration, storageUpdateConfiguration);
}
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/SortedIndexLockerTest.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/SortedIndexLockerTest.java
index f6ed8fd620..7ea553adda 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/SortedIndexLockerTest.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/SortedIndexLockerTest.java
@@ -36,7 +36,9 @@ import
org.apache.ignite.internal.storage.index.StorageSortedIndexDescriptor.Sto
import org.apache.ignite.internal.storage.index.impl.TestSortedIndexStorage;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.tx.Lock;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
import org.apache.ignite.internal.type.NativeTypes;
import org.jetbrains.annotations.Nullable;
@@ -61,11 +63,17 @@ class SortedIndexLockerTest extends BaseIgniteAbstractTest {
);
indexStorage.destroy();
- SortedIndexLocker locker = new SortedIndexLocker(1, PARTITION_ID, new
HeapLockManager(), indexStorage, row -> binaryTuple, false);
+ SortedIndexLocker locker = new SortedIndexLocker(1, PARTITION_ID,
lockManager(), indexStorage, row -> binaryTuple, false);
UUID txId =
TestTransactionIds.TRANSACTION_ID_GENERATOR.transactionIdFor(clock.now());
CompletableFuture<@Nullable Lock> lockFuture =
locker.locksForInsert(txId, mock(BinaryRow.class), new RowId(PARTITION_ID));
assertThat(lockFuture, willBe(nullValue()));
}
+
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
}
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
index 568bd009a9..7ab9e26d73 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
@@ -116,6 +116,7 @@ import org.apache.ignite.internal.tx.TxState;
import org.apache.ignite.internal.tx.TxStateMeta;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.RemotelyTriggeredResourceRegistry;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.storage.state.test.TestTxStateStorage;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
import org.apache.ignite.internal.type.NativeTypes;
@@ -142,7 +143,7 @@ public class PartitionReplicaListenerIndexLockingTest
extends IgniteAbstractTest
private static final UUID TRANSACTION_ID =
TestTransactionIds.newTransactionId();
private static final HybridClock CLOCK = new HybridClockImpl();
private static final ClockService CLOCK_SERVICE = new
TestClockService(CLOCK);
- private static final LockManager LOCK_MANAGER = new HeapLockManager();
+ private static final LockManager LOCK_MANAGER = lockManager();
private static final TablePartitionId PARTITION_ID = new
TablePartitionId(TABLE_ID, PART_ID);
private static final PartitionReplicationMessagesFactory
TABLE_MESSAGES_FACTORY = new PartitionReplicationMessagesFactory();
private static final TestMvPartitionStorage TEST_MV_PARTITION_STORAGE =
new TestMvPartitionStorage(PART_ID);
@@ -311,6 +312,12 @@ public class PartitionReplicaListenerIndexLockingTest
extends IgniteAbstractTest
return txManager;
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
@BeforeEach
public void beforeTest() {
((TestHashIndexStorage) pkStorage.get().storage()).clear();
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerSortedIndexLockingTest.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerSortedIndexLockingTest.java
index 417d81e429..af785a9569 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerSortedIndexLockingTest.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerSortedIndexLockingTest.java
@@ -111,6 +111,7 @@ import org.apache.ignite.internal.tx.TxState;
import org.apache.ignite.internal.tx.TxStateMeta;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.RemotelyTriggeredResourceRegistry;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.storage.state.test.TestTxStateStorage;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
import org.apache.ignite.internal.type.NativeTypes;
@@ -135,7 +136,7 @@ public class PartitionReplicaListenerSortedIndexLockingTest
extends IgniteAbstra
private static final UUID TRANSACTION_ID =
TestTransactionIds.newTransactionId();
private static final HybridClock CLOCK = new HybridClockImpl();
private static final ClockService CLOCK_SERVICE = new
TestClockService(CLOCK);
- private static final LockManager LOCK_MANAGER = new HeapLockManager();
+ private static final LockManager LOCK_MANAGER = lockManager();
private static final TablePartitionId PARTITION_ID = new
TablePartitionId(TABLE_ID, PART_ID);
private static final PartitionReplicationMessagesFactory
TABLE_MESSAGES_FACTORY = new PartitionReplicationMessagesFactory();
private static final TestMvPartitionStorage TEST_MV_PARTITION_STORAGE =
new TestMvPartitionStorage(PART_ID);
@@ -286,6 +287,12 @@ public class
PartitionReplicaListenerSortedIndexLockingTest extends IgniteAbstra
LOCK_MANAGER.releaseAll(TRANSACTION_ID);
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
/** Verifies the mode in which the lock was acquired on the index key for
a particular operation. */
@ParameterizedTest
@MethodSource("readWriteSingleTestArguments")
diff --git
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
index 9dd710bcd8..340c7bd94e 100644
---
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
+++
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
@@ -218,6 +218,7 @@ import
org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.RemotelyTriggeredResourceRegistry;
import org.apache.ignite.internal.tx.impl.TxMessageSender;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.message.TransactionMetaMessage;
import org.apache.ignite.internal.tx.message.TxFinishReplicaRequest;
import org.apache.ignite.internal.tx.message.TxMessagesFactory;
@@ -287,7 +288,7 @@ public class PartitionReplicaListenerTest extends
IgniteAbstractTest {
/** The storage stores partition data. */
private final TestMvPartitionStorage testMvPartitionStorage = new
TestMvPartitionStorage(PART_ID);
- private final LockManager lockManager = new HeapLockManager();
+ private final LockManager lockManager = lockManager();
private final Function<Command, CompletableFuture<?>>
defaultMockRaftFutureClosure = cmd -> {
if (cmd instanceof WriteIntentSwitchCommand) {
@@ -662,6 +663,12 @@ public class PartitionReplicaListenerTest extends
IgniteAbstractTest {
Mockito.framework().clearInlineMocks();
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
private static SchemaDescriptor schemaDescriptorWith(int ver) {
return new SchemaDescriptor(ver, new Column[]{
new Column("intKey".toUpperCase(Locale.ROOT),
NativeTypes.INT32, false),
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/LockManager.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/LockManager.java
index 65e6132cd6..e696997f45 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/LockManager.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/LockManager.java
@@ -28,6 +28,13 @@ import org.jetbrains.annotations.TestOnly;
/** Lock manager allows to acquire locks and release locks and supports
deadlock prevention by transaction id ordering. */
public interface LockManager extends EventProducer<LockEvent,
LockEventParameters> {
+ /**
+ * Start the lock manager.
+ *
+ * @param deadlockPreventionPolicy Deadlock prevention policy.
+ */
+ void start(DeadlockPreventionPolicy deadlockPreventionPolicy);
+
/**
* Attempts to acquire a lock for the specified {@code lockKey} in
specified {@code lockMode}.
*
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/DeadlockPreventionPolicyConfigurationSchema.java
similarity index 60%
copy from
modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
copy to
modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/DeadlockPreventionPolicyConfigurationSchema.java
index 43b2baacf6..4058823673 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/DeadlockPreventionPolicyConfigurationSchema.java
@@ -15,22 +15,21 @@
* limitations under the License.
*/
-package org.apache.ignite.internal.tx;
+package org.apache.ignite.internal.tx.configuration;
-import org.apache.ignite.internal.tx.impl.HeapLockManager;
-import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
+import org.apache.ignite.configuration.annotation.Config;
+import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.validation.OneOf;
/**
- * Test class for {@link HeapLockManager}.
+ * Configuration schema for deadlock prevention policy.
*/
-public class HeapLockManagerTest extends AbstractLockManagerTest {
- @Override
- protected LockManager newInstance() {
- return new HeapLockManager(new WaitDieDeadlockPreventionPolicy());
- }
+@Config
+public class DeadlockPreventionPolicyConfigurationSchema {
+ @OneOf({"NATURAL", "REVERSED", "NONE"})
+ @Value(hasDefault = true)
+ public String txIdComparator = "NATURAL";
- @Override
- protected LockKey lockKey() {
- return new LockKey(0, "test");
- }
+ @Value(hasDefault = true)
+ public long waitTimeout = 0;
}
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/TransactionConfigurationSchema.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/TransactionConfigurationSchema.java
index dfdef9d133..0a619c7b90 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/TransactionConfigurationSchema.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/configuration/TransactionConfigurationSchema.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.tx.configuration;
import java.util.concurrent.TimeUnit;
import org.apache.ignite.configuration.annotation.Config;
+import org.apache.ignite.configuration.annotation.ConfigValue;
import org.apache.ignite.configuration.annotation.Value;
import org.apache.ignite.configuration.validation.Range;
@@ -54,4 +55,7 @@ public class TransactionConfigurationSchema {
@Value(hasDefault = true)
@Range(min = 1000)
public long rpcTimeout = TimeUnit.SECONDS.toMillis(60);
+
+ @ConfigValue
+ public DeadlockPreventionPolicyConfigurationSchema
deadlockPreventionPolicy;
}
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/DeadlockPreventionPolicyImpl.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/DeadlockPreventionPolicyImpl.java
new file mode 100644
index 0000000000..ba696f37f7
--- /dev/null
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/DeadlockPreventionPolicyImpl.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.tx.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Comparator;
+import java.util.UUID;
+import org.apache.ignite.internal.tx.DeadlockPreventionPolicy;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Implementation of {@link DeadlockPreventionPolicy} that allows to set its
parameters directly in the constructor, so it is able to
+ * provide different policies' behaviour such as wait-die, reversed wait-die,
timeout wait, no-wait, etc.
+ */
+public class DeadlockPreventionPolicyImpl implements DeadlockPreventionPolicy {
+ private final Comparator<UUID> txIdComparator;
+
+ private final long waitTimeout;
+
+ /**
+ * Constructor.
+ *
+ * @param txIdComparator Comparator name.
+ * @param waitTimeout Wait timeout.
+ */
+ public DeadlockPreventionPolicyImpl(String txIdComparator, long
waitTimeout) {
+ this(TxIdComparators.valueOf(requireNonNull(txIdComparator)),
waitTimeout);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param txIdComparator Comparator name as {@link TxIdComparators}
element.
+ * @param waitTimeout Wait timeout.
+ */
+ public DeadlockPreventionPolicyImpl(TxIdComparators txIdComparator, long
waitTimeout) {
+ switch (txIdComparator) {
+ case NATURAL: {
+ this.txIdComparator = new TxIdPriorityComparator();
+ break;
+ }
+ case REVERSE: {
+ this.txIdComparator = new TxIdPriorityComparator().reversed();
+ break;
+ }
+ case NONE: {
+ this.txIdComparator = null;
+ break;
+ }
+ default: {
+ throw new IllegalArgumentException("Unknown comparator type: "
+ txIdComparator);
+ }
+ }
+
+ this.waitTimeout = waitTimeout;
+ }
+
+ @Override
+ public @Nullable Comparator<UUID> txIdComparator() {
+ return txIdComparator;
+ }
+
+ @Override
+ public long waitTimeout() {
+ return waitTimeout;
+ }
+
+ /**
+ * Enum of names of transaction ID comparators.
+ */
+ public enum TxIdComparators {
+ NATURAL,
+ REVERSE,
+ NONE
+ }
+}
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
index 60ddf4dad1..b74b9029bb 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
@@ -84,6 +84,12 @@ public class HeapLockManager extends
AbstractEventProducer<LockEvent, LockEventP
*/
private static final int CONCURRENCY = Math.max(1,
Runtime.getRuntime().availableProcessors() / 2);
+ /** Lock map size. */
+ private final int lockMapSize;
+
+ /** Raw slots size. */
+ private final int rawSlotsMaxSize;
+
/**
* Empty slots.
*/
@@ -92,22 +98,22 @@ public class HeapLockManager extends
AbstractEventProducer<LockEvent, LockEventP
/**
* Mapped slots.
*/
- private final ConcurrentHashMap<LockKey, LockState> locks;
+ private ConcurrentHashMap<LockKey, LockState> locks;
/**
* Raw slots.
*/
- private final LockState[] slots;
+ private LockState[] slots;
/**
* The policy.
*/
- private final DeadlockPreventionPolicy deadlockPreventionPolicy;
+ private DeadlockPreventionPolicy deadlockPreventionPolicy;
/**
* Executor that is used to fail waiters after timeout.
*/
- private final Executor delayedExecutor;
+ private Executor delayedExecutor;
/**
* Enlisted transactions.
@@ -123,39 +129,38 @@ public class HeapLockManager extends
AbstractEventProducer<LockEvent, LockEventP
* Constructor.
*/
public HeapLockManager() {
- this(new WaitDieDeadlockPreventionPolicy(), SLOTS, SLOTS);
- }
-
- /**
- * Constructor.
- */
- public HeapLockManager(DeadlockPreventionPolicy deadlockPreventionPolicy) {
- this(deadlockPreventionPolicy, SLOTS, SLOTS);
+ this(SLOTS, SLOTS);
}
/**
* Constructor.
*
- * @param deadlockPreventionPolicy Deadlock prevention policy.
- * @param maxSize Raw slots size.
- * @param mapSize Lock map size.
+ * @param rawSlotsMaxSize Raw slots size.
+ * @param lockMapSize Lock map size.
*/
- public HeapLockManager(DeadlockPreventionPolicy deadlockPreventionPolicy,
int maxSize, int mapSize) {
- if (mapSize > maxSize) {
- throw new IllegalArgumentException("maxSize=" + maxSize + " <
mapSize=" + mapSize);
+ public HeapLockManager(int rawSlotsMaxSize, int lockMapSize) {
+ if (lockMapSize > rawSlotsMaxSize) {
+ throw new IllegalArgumentException("maxSize=" + rawSlotsMaxSize +
" < mapSize=" + lockMapSize);
}
+ this.rawSlotsMaxSize = rawSlotsMaxSize;
+ this.lockMapSize = lockMapSize;
+ }
+
+ @Override
+ public void start(DeadlockPreventionPolicy deadlockPreventionPolicy) {
this.deadlockPreventionPolicy = deadlockPreventionPolicy;
+
this.delayedExecutor = deadlockPreventionPolicy.waitTimeout() > 0
?
CompletableFuture.delayedExecutor(deadlockPreventionPolicy.waitTimeout(),
TimeUnit.MILLISECONDS)
: null;
- locks = new ConcurrentHashMap<>(mapSize);
+ locks = new ConcurrentHashMap<>(lockMapSize);
- LockState[] tmp = new LockState[maxSize];
+ LockState[] tmp = new LockState[rawSlotsMaxSize];
for (int i = 0; i < tmp.length; i++) {
LockState lockState = new LockState();
- if (i < mapSize) {
+ if (i < lockMapSize) {
empty.add(lockState);
}
tmp[i] = lockState;
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
index d8bae15056..ba9a931e6d 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
@@ -737,6 +737,14 @@ public class TxManagerImpl implements TxManager,
NetworkMessageHandler {
@Override
public CompletableFuture<Void> startAsync(ComponentContext
componentContext) {
return inBusyLockAsync(busyLock, () -> {
+ var deadlockPreventionPolicy = new DeadlockPreventionPolicyImpl(
+
txConfig.deadlockPreventionPolicy().txIdComparator().value(),
+ txConfig.deadlockPreventionPolicy().waitTimeout().value()
+ );
+
+ // TODO https://issues.apache.org/jira/browse/IGNITE-23539
+ lockManager.start(deadlockPreventionPolicy);
+
localNodeId = topologyService.localMember().id();
messagingService.addMessageHandler(ReplicaMessageGroup.class,
this);
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractDeadlockPreventionTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractDeadlockPreventionTest.java
index dc66dbec6c..631a6fd26d 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractDeadlockPreventionTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractDeadlockPreventionTest.java
@@ -27,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.fail;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
-import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.junit.jupiter.api.Test;
/**
@@ -38,7 +37,7 @@ public abstract class AbstractDeadlockPreventionTest extends
AbstractLockingTest
@Override
protected LockManager lockManager() {
- return new HeapLockManager(deadlockPreventionPolicy());
+ return lockManager(deadlockPreventionPolicy());
}
@Test
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockingTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockingTest.java
index e0f2e844a0..45ba36b335 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockingTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockingTest.java
@@ -29,6 +29,7 @@ import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.lang.IgniteBiTuple;
+import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
/**
@@ -40,6 +41,12 @@ public abstract class AbstractLockingTest {
protected abstract LockManager lockManager();
+ protected static LockManager lockManager(DeadlockPreventionPolicy
deadlockPreventionPolicy) {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(deadlockPreventionPolicy);
+ return lockManager;
+ }
+
protected UUID beginTx() {
return TestTransactionIds.newTransactionId();
}
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/CoarseGrainedLockManagerTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/CoarseGrainedLockManagerTest.java
index d3348e7e06..e71c94a0bd 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/CoarseGrainedLockManagerTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/CoarseGrainedLockManagerTest.java
@@ -33,13 +33,19 @@ import org.junit.jupiter.api.Test;
* Tests coarse lock modes. It allows IX, S locks and upgrade from S to SIX
(S, then IX).
*/
public class CoarseGrainedLockManagerTest {
- private final HeapLockManager lockManager = new HeapLockManager(new
WaitDieDeadlockPreventionPolicy());
+ private final HeapLockManager lockManager = lockManager();
@AfterEach
void after() {
assertTrue(lockManager.isEmpty());
}
+ private static HeapLockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
@Test
public void testSimple() {
UUID older = TestTransactionIds.newTransactionId();
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/DeadlockPreventionPolicyConfigurationTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/DeadlockPreventionPolicyConfigurationTest.java
new file mode 100644
index 0000000000..cee63cf19f
--- /dev/null
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/DeadlockPreventionPolicyConfigurationTest.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.tx;
+
+import static
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators.NATURAL;
+import static
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators.NONE;
+import static
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators.REVERSE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Comparator;
+import java.util.UUID;
+import
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
+import
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.tx.configuration.TransactionConfiguration;
+import org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl;
+import
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators;
+import org.apache.ignite.internal.tx.impl.TxIdPriorityComparator;
+import org.jetbrains.annotations.Nullable;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ * Tests for {@link
org.apache.ignite.internal.tx.configuration.DeadlockPreventionPolicyConfigurationSchema}.
+ */
+@ExtendWith(ConfigurationExtension.class)
+public class DeadlockPreventionPolicyConfigurationTest extends
BaseIgniteAbstractTest {
+ @InjectConfiguration
+ private TransactionConfiguration transactionConfigurationDefault;
+
+ @InjectConfiguration("mock: { deadlockPreventionPolicy: { waitTimeout:
1000, txIdComparator: NATURAL } }")
+ private TransactionConfiguration transactionConfigurationMockedNatural;
+
+ @InjectConfiguration("mock: { deadlockPreventionPolicy: { waitTimeout:
100, txIdComparator: REVERSE } }")
+ private TransactionConfiguration transactionConfigurationMockedReverse;
+
+ @InjectConfiguration("mock: { deadlockPreventionPolicy: { waitTimeout: 0,
txIdComparator: NONE } }")
+ private TransactionConfiguration transactionConfigurationMockedNone;
+
+ @Test
+ public void checkDefaults() {
+ assertEquals(0,
transactionConfigurationDefault.deadlockPreventionPolicy().waitTimeout().value());
+ assertEquals(NATURAL.toString(),
+
transactionConfigurationDefault.deadlockPreventionPolicy().txIdComparator().value());
+
+ assertPolicyIsCorrect(createPolicy(transactionConfigurationDefault),
transactionConfigurationDefault);
+ }
+
+ @Test
+ public void checkMockedNatural() {
+ assertEquals(1000,
transactionConfigurationMockedNatural.deadlockPreventionPolicy().waitTimeout().value());
+ assertEquals(NATURAL.toString(),
+
transactionConfigurationMockedNatural.deadlockPreventionPolicy().txIdComparator().value());
+
+
assertPolicyIsCorrect(createPolicy(transactionConfigurationMockedNatural),
transactionConfigurationMockedNatural);
+ }
+
+ @Test
+ public void checkMockedReverse() {
+ assertEquals(100,
transactionConfigurationMockedReverse.deadlockPreventionPolicy().waitTimeout().value());
+ assertEquals(REVERSE.toString(),
+
transactionConfigurationMockedReverse.deadlockPreventionPolicy().txIdComparator().value());
+
+
assertPolicyIsCorrect(createPolicy(transactionConfigurationMockedReverse),
transactionConfigurationMockedReverse);
+ }
+
+ @Test
+ public void checkMockedNone() {
+ assertEquals(0,
transactionConfigurationMockedNone.deadlockPreventionPolicy().waitTimeout().value());
+ assertEquals(NONE.toString(),
+
transactionConfigurationMockedNone.deadlockPreventionPolicy().txIdComparator().value());
+
+
assertPolicyIsCorrect(createPolicy(transactionConfigurationMockedNone),
transactionConfigurationMockedNone);
+ }
+
+ private void assertPolicyIsCorrect(DeadlockPreventionPolicy policy,
TransactionConfiguration cfg) {
+ assertEquals(cfg.deadlockPreventionPolicy().waitTimeout().value(),
policy.waitTimeout());
+ assertComparatorIsCorrect(policy.txIdComparator(),
cfg.deadlockPreventionPolicy().txIdComparator().value());
+ }
+
+ private DeadlockPreventionPolicy createPolicy(TransactionConfiguration
cfg) {
+ return new DeadlockPreventionPolicyImpl(
+ cfg.deadlockPreventionPolicy().txIdComparator().value(),
+ cfg.deadlockPreventionPolicy().waitTimeout().value()
+ );
+ }
+
+ private void assertComparatorIsCorrect(@Nullable Comparator<UUID>
actualComparator, String configured) {
+ TxIdComparators configuredEnum = TxIdComparators.valueOf(configured);
+
+ if (actualComparator == null) {
+ assertEquals(NONE, configuredEnum);
+ return;
+ }
+
+ TxIdPriorityComparator naturalComparator = new
TxIdPriorityComparator();
+
+ UUID uuid1 = UUID.randomUUID();
+ UUID uuid2;
+
+ do {
+ uuid2 = UUID.randomUUID();
+ } while (naturalComparator.compare(uuid1, uuid2) == 0);
+
+ UUID greater = naturalComparator.compare(uuid1, uuid2) > 0 ? uuid1 :
uuid2;
+ UUID lesser = naturalComparator.compare(uuid1, uuid2) > 0 ? uuid2 :
uuid1;
+
+ int cmp = actualComparator.compare(greater, lesser);
+ if (cmp > 0) {
+ assertEquals(NATURAL, configuredEnum);
+ } else {
+ assertEquals(REVERSE, configuredEnum);
+ }
+ }
+}
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerEventsTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerEventsTest.java
index 3b4621add0..270116c2c4 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerEventsTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerEventsTest.java
@@ -26,6 +26,6 @@ import
org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
public class HeapLockManagerEventsTest extends AbstractLockManagerEventsTest {
@Override
protected LockManager lockManager() {
- return new HeapLockManager(new WaitDieDeadlockPreventionPolicy());
+ return lockManager(new WaitDieDeadlockPreventionPolicy());
}
}
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
index 43b2baacf6..dd641295a2 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/HeapLockManagerTest.java
@@ -26,7 +26,9 @@ import
org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
public class HeapLockManagerTest extends AbstractLockManagerTest {
@Override
protected LockManager newInstance() {
- return new HeapLockManager(new WaitDieDeadlockPreventionPolicy());
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
}
@Override
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/NoWaitDeadlockPreventionTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/NoWaitDeadlockPreventionTest.java
index 6319536ee7..d84c0969ed 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/NoWaitDeadlockPreventionTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/NoWaitDeadlockPreventionTest.java
@@ -23,7 +23,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.tx.impl.HeapLockManager;
+import org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl;
+import
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators;
import org.junit.jupiter.api.Test;
/**
@@ -32,17 +33,12 @@ import org.junit.jupiter.api.Test;
*/
public class NoWaitDeadlockPreventionTest extends AbstractLockingTest {
DeadlockPreventionPolicy deadlockPreventionPolicy() {
- return new DeadlockPreventionPolicy() {
- @Override
- public long waitTimeout() {
- return 0;
- }
- };
+ return new DeadlockPreventionPolicyImpl(TxIdComparators.NONE, 0);
}
@Override
protected LockManager lockManager() {
- return new HeapLockManager(deadlockPreventionPolicy());
+ return lockManager(deadlockPreventionPolicy());
}
@Test
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/ReversedDeadlockPreventionTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/ReversedDeadlockPreventionTest.java
index b4b7419f48..75ae158c19 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/ReversedDeadlockPreventionTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/ReversedDeadlockPreventionTest.java
@@ -22,11 +22,10 @@ import static
org.apache.ignite.internal.testframework.matchers.CompletableFutur
import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
import static org.hamcrest.MatcherAssert.assertThat;
-import java.util.Comparator;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.tx.impl.TxIdPriorityComparator;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl;
+import
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -54,17 +53,7 @@ public class ReversedDeadlockPreventionTest extends
AbstractDeadlockPreventionTe
@Override
protected DeadlockPreventionPolicy deadlockPreventionPolicy() {
- return new DeadlockPreventionPolicy() {
- @Override
- public @Nullable Comparator<UUID> txIdComparator() {
- return new TxIdPriorityComparator().reversed();
- }
-
- @Override
- public long waitTimeout() {
- return 0;
- }
- };
+ return new DeadlockPreventionPolicyImpl(TxIdComparators.REVERSE, 0);
}
@Test
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TimeoutDeadlockPreventionTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TimeoutDeadlockPreventionTest.java
index 05af5790ba..d57610d308 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TimeoutDeadlockPreventionTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TimeoutDeadlockPreventionTest.java
@@ -23,6 +23,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl;
+import
org.apache.ignite.internal.tx.impl.DeadlockPreventionPolicyImpl.TxIdComparators;
import org.junit.jupiter.api.Test;
/**
@@ -31,12 +33,7 @@ import org.junit.jupiter.api.Test;
public class TimeoutDeadlockPreventionTest extends
AbstractDeadlockPreventionTest {
@Override
protected DeadlockPreventionPolicy deadlockPreventionPolicy() {
- return new DeadlockPreventionPolicy() {
- @Override
- public long waitTimeout() {
- return 200;
- }
- };
+ return new DeadlockPreventionPolicyImpl(TxIdComparators.NONE, 200);
}
@Test
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
index 3afafbaa0f..0cf3938689 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
@@ -84,6 +84,7 @@ import
org.apache.ignite.internal.tx.impl.RemotelyTriggeredResourceRegistry;
import org.apache.ignite.internal.tx.impl.TransactionIdGenerator;
import org.apache.ignite.internal.tx.impl.TransactionInflights;
import org.apache.ignite.internal.tx.impl.TxManagerImpl;
+import org.apache.ignite.internal.tx.impl.WaitDieDeadlockPreventionPolicy;
import org.apache.ignite.internal.tx.message.TxFinishReplicaRequest;
import org.apache.ignite.internal.tx.test.TestLocalRwTxCounter;
import org.apache.ignite.internal.tx.test.TestTransactionIds;
@@ -158,7 +159,7 @@ public class TxManagerTest extends IgniteAbstractTest {
txConfiguration,
clusterService,
replicaService,
- new HeapLockManager(),
+ lockManager(),
clockService,
new TransactionIdGenerator(0xdeadbeef),
placementDriver,
@@ -172,6 +173,12 @@ public class TxManagerTest extends IgniteAbstractTest {
assertThat(txManager.startAsync(new ComponentContext()),
willCompleteSuccessfully());
}
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
@AfterEach
public void tearDown() {
txManager.beforeNodeStop();
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/OrphanDetectorTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/OrphanDetectorTest.java
index ea251e430f..f690790339 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/OrphanDetectorTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/OrphanDetectorTest.java
@@ -54,6 +54,7 @@ import
org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.tx.Lock;
import org.apache.ignite.internal.tx.LockException;
import org.apache.ignite.internal.tx.LockKey;
+import org.apache.ignite.internal.tx.LockManager;
import org.apache.ignite.internal.tx.LockMode;
import org.apache.ignite.internal.tx.TxState;
import org.apache.ignite.internal.tx.TxStateMeta;
@@ -87,7 +88,7 @@ public class OrphanDetectorTest extends
BaseIgniteAbstractTest {
@Mock
private PlacementDriver placementDriver;
- private final HeapLockManager lockManager = new HeapLockManager();
+ private final LockManager lockManager = lockManager();
private final HybridClock clock = new HybridClockImpl();
@@ -102,6 +103,12 @@ public class OrphanDetectorTest extends
BaseIgniteAbstractTest {
private TransactionIdGenerator idGenerator;
+ private static LockManager lockManager() {
+ HeapLockManager lockManager = new HeapLockManager();
+ lockManager.start(new WaitDieDeadlockPreventionPolicy());
+ return lockManager;
+ }
+
@BeforeEach
public void setup() {
idGenerator = new TransactionIdGenerator(LOCAL_NODE.name().hashCode());