Skip to content

Commit e91cdff

Browse files
committed
IGNITE-24963 Post review fixes 6
1 parent ab0a59c commit e91cdff

7 files changed

Lines changed: 34 additions & 18 deletions

File tree

modules/transactions/src/main/java/org/apache/ignite/internal/tx/DeadlockPreventionPolicy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public interface DeadlockPreventionPolicy {
4242
*
4343
* @return Transaction id comparator.
4444
*/
45-
@Nullable default Comparator<UUID> txIdComparator() {
45+
default Comparator<UUID> txIdComparator() {
4646
return TX_ID_PRIORITY_COMPARATOR;
4747
}
4848

@@ -51,6 +51,7 @@ public interface DeadlockPreventionPolicy {
5151
* of this transaction with another one on certain key. If a policy allows deadlock prevention,
5252
* then this timeout is applied only to a waiting transaction. If this method returns {@code 0} this means that
5353
* the lock attempt is aborted instantly (timeout is zero). If lesser that {@code 0}, it means that the wait time is infinite.
54+
* TODO IGNITE-28507 make configurable.
5455
*
5556
* @return Timeout, in milliseconds.
5657
*/

modules/transactions/src/main/java/org/apache/ignite/internal/tx/TransactionIds.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,28 @@ public static int hash(UUID txId, int divisor) {
9494
private static int spread(int h) {
9595
return (h ^ (h >>> 16)) & 0x7fffffff;
9696
}
97+
98+
/**
99+
* Compares transaction IDs based on their associated priorities and the IDs themselves.
100+
* The IDs with higher priorities are sorted first.
101+
* If the priorities are equal, the IDs are sorted by their natural order, based on tx begin timestamp,
102+
* which implies older transactions having more priority than younger.
103+
*
104+
* @param id1 id1.
105+
* @param id2 id2.
106+
*
107+
* @return The result.
108+
*/
109+
public static int compare(UUID id1, UUID id2) {
110+
TxPriority priority1 = priority(id1);
111+
TxPriority priority2 = priority(id2);
112+
113+
int priorityComparison = priority1.compareTo(priority2);
114+
115+
if (priorityComparison == 0) {
116+
return id1.compareTo(id2);
117+
} else {
118+
return priorityComparison * -1; // Reverse order.
119+
}
120+
}
97121
}

modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ public CompletableFuture<Lock> acquire(UUID txId, LockMode lockMode) {
625625

626626
// Prevent deadlocks by allowing only younger transactions to wait.
627627
for (Lock lock : ixlockOwners.values()) {
628-
if (deadlockPreventionPolicy.txIdComparator().compare(txId, lock.txId()) < 0) {
628+
if (TransactionIds.compare(txId, lock.txId()) < 0) {
629629
return notifyAndFail(txId, lock.txId(), lockMode, lock.lockMode());
630630
}
631631
}

modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReversedWaitDieDeadlockPreventionPolicy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.ignite.internal.tx.impl;
1919

2020
import org.apache.ignite.internal.tx.DeadlockPreventionPolicy;
21+
import org.apache.ignite.internal.tx.TransactionIds;
2122
import org.apache.ignite.internal.tx.Waiter;
2223

2324
/**
@@ -27,7 +28,7 @@
2728
public class ReversedWaitDieDeadlockPreventionPolicy implements DeadlockPreventionPolicy {
2829
@Override
2930
public Waiter allowWait(Waiter waiter, Waiter owner) {
30-
int res = txIdComparator().compare(waiter.txId(), owner.txId());
31+
int res = TransactionIds.compare(waiter.txId(), owner.txId());
3132
assert res != 0;
3233

3334
// Waiter is allowed to wait for owner if it's younger.

modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxIdPriorityComparator.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,14 @@
2020
import java.util.Comparator;
2121
import java.util.UUID;
2222
import org.apache.ignite.internal.tx.TransactionIds;
23-
import org.apache.ignite.internal.tx.TxPriority;
2423

2524
/**
2625
* Comparator for transaction IDs based on their associated priorities and the IDs themselves. The IDs with higher priorities are sorted
2726
* first. If the priorities are equal, the IDs are sorted by their natural order.
2827
*/
2928
public class TxIdPriorityComparator implements Comparator<UUID> {
30-
private static final Comparator<TxPriority> TX_PRIORITY_COMPARATOR = TxPriority::compareTo;
31-
3229
@Override
3330
public int compare(UUID o1, UUID o2) {
34-
TxPriority priority1 = TransactionIds.priority(o1);
35-
TxPriority priority2 = TransactionIds.priority(o2);
36-
37-
int priorityComparison = TX_PRIORITY_COMPARATOR.compare(priority1, priority2);
38-
39-
if (priorityComparison == 0) {
40-
return o1.compareTo(o2);
41-
} else {
42-
return priorityComparison * -1; // Reverse order.
43-
}
31+
return TransactionIds.compare(o1, o2);
4432
}
4533
}

modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/WaitDieDeadlockPreventionPolicy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.ignite.internal.tx.impl;
1919

2020
import org.apache.ignite.internal.tx.DeadlockPreventionPolicy;
21+
import org.apache.ignite.internal.tx.TransactionIds;
2122
import org.apache.ignite.internal.tx.Waiter;
2223

2324
/**
@@ -39,7 +40,7 @@ public long waitTimeout() {
3940

4041
@Override
4142
public final Waiter allowWait(Waiter waiter, Waiter owner) {
42-
int res = txIdComparator().compare(waiter.txId(), owner.txId());
43+
int res = TransactionIds.compare(waiter.txId(), owner.txId());
4344
assert res != 0;
4445

4546
// Waiter is allowed to wait for owner if it has higher priority.

modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/WoundWaitDeadlockPreventionPolicy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.ignite.internal.tx.impl;
1919

2020
import org.apache.ignite.internal.tx.DeadlockPreventionPolicy;
21+
import org.apache.ignite.internal.tx.TransactionIds;
2122
import org.apache.ignite.internal.tx.Waiter;
2223

2324
/**
@@ -33,7 +34,7 @@
3334
public class WoundWaitDeadlockPreventionPolicy implements DeadlockPreventionPolicy {
3435
@Override
3536
public Waiter allowWait(Waiter waiter, Waiter owner) {
36-
int res = txIdComparator().compare(waiter.txId(), owner.txId());
37+
int res = TransactionIds.compare(waiter.txId(), owner.txId());
3738
assert res != 0;
3839

3940
// Waiter is allowed to wait for owner if it has lower priority.

0 commit comments

Comments
 (0)