This is an automated email from the ASF dual-hosted git repository.
sk0x50 pushed a commit to branch ignite-3.0.0-beta1
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/ignite-3.0.0-beta1 by this
push:
new c8e9df7386 IGNITE-17806 Remove transaction state PENDING (#1217)
c8e9df7386 is described below
commit c8e9df7386c0f85649af42cad78334b2cb7de749
Author: Sergey Uttsel <[email protected]>
AuthorDate: Wed Oct 19 09:21:46 2022 +0300
IGNITE-17806 Remove transaction state PENDING (#1217)
(cherry picked from commit 3bc678dea76451a8d7efc9350a6d666b7157af19)
---
.../internal/sql/api/ItSqlAsynchronousApiTest.java | 3 +-
.../internal/sql/api/ItSqlSynchronousApiTest.java | 7 +---
.../table/distributed/raft/PartitionListener.java | 3 +-
.../distributed/storage/InternalTableImpl.java | 3 +-
modules/transactions/README.md | 7 ++--
.../org/apache/ignite/internal/tx/TxManager.java | 29 --------------
.../org/apache/ignite/internal/tx/TxState.java | 1 -
.../ignite/internal/tx/impl/TxManagerImpl.java | 44 +---------------------
.../apache/ignite/internal/tx/TxManagerTest.java | 1 -
.../storage/state/TxStateStorageAbstractTest.java | 33 ++++++++--------
10 files changed, 26 insertions(+), 105 deletions(-)
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
index 751ed2e8e3..e6e5de129a 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
@@ -23,7 +23,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -330,7 +329,7 @@ public class ItSqlAsynchronousApiTest extends
AbstractBasicIntegrationTest {
var states = (Map<UUID, TxState>)
IgniteTestUtils.getFieldValue(txManagerInternal, TxManagerImpl.class, "states");
- states.forEach((k, v) -> assertNotSame(v, TxState.PENDING));
+ assertEquals(txManagerInternal.finished(), states.size());
}
@Test
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
index 7e5c99193b..308b2a6920 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.sql.api;
import static
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -57,7 +56,6 @@ import org.apache.ignite.sql.SqlBatchException;
import org.apache.ignite.sql.SqlException;
import org.apache.ignite.table.Table;
import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
@@ -195,7 +193,7 @@ public class ItSqlSynchronousApiTest extends
AbstractBasicIntegrationTest {
var states = (Map<UUID, TxState>)
IgniteTestUtils.getFieldValue(txManagerInternal, TxManagerImpl.class, "states");
- states.forEach((k, v) -> assertNotSame(v, TxState.PENDING));
+ assertEquals(txManagerInternal.finished(), states.size());
checkDml(ROW_COUNT, ses, "UPDATE TEST SET VAL0 = VAL0 + ?", 1);
@@ -227,7 +225,6 @@ public class ItSqlSynchronousApiTest extends
AbstractBasicIntegrationTest {
}
@Test
- @Disabled ("IGNITE-17806 Rollback SQL automatically created transaction
when an error has happened")
public void errors() throws InterruptedException {
sql("CREATE TABLE TEST(ID INT PRIMARY KEY, VAL0 INT)");
for (int i = 0; i < ROW_COUNT; ++i) {
@@ -283,7 +280,7 @@ public class ItSqlSynchronousApiTest extends
AbstractBasicIntegrationTest {
var states = (Map<UUID, TxState>)
IgniteTestUtils.getFieldValue(txManagerInternal, TxManagerImpl.class, "states");
- states.forEach((k, v) -> assertNotSame(v, TxState.PENDING));
+ assertEquals(txManagerInternal.finished(), states.size());
}
@Test
diff --git
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
index 95f251fb48..b7e7f1f0c9 100644
---
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
+++
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.table.distributed.raft;
import static org.apache.ignite.internal.tx.TxState.ABORTED;
import static org.apache.ignite.internal.tx.TxState.COMMITED;
-import static org.apache.ignite.internal.tx.TxState.PENDING;
import static
org.apache.ignite.lang.ErrorGroups.Transactions.TX_UNEXPECTED_STATE_ERR;
import static org.apache.ignite.lang.IgniteStringFormatter.format;
@@ -334,7 +333,7 @@ public class PartitionListener implements RaftGroupListener
{
txsPendingRowIds.remove(txId);
// TODO: IGNITE-17638 TestOnly code, let's consider using Txn
state map instead of states.
- txManager.changeState(txId, PENDING, cmd.commit() ? COMMITED :
ABORTED);
+ txManager.changeState(txId, null, cmd.commit() ? COMMITED :
ABORTED);
storage.lastAppliedIndex(commandIndex);
diff --git
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
index 5396321be6..08e8d622db 100644
---
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
+++
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
@@ -51,7 +51,6 @@ import
org.apache.ignite.internal.table.distributed.replication.request.ReadWrit
import
org.apache.ignite.internal.table.distributed.replicator.action.RequestType;
import org.apache.ignite.internal.tx.InternalTransaction;
import org.apache.ignite.internal.tx.TxManager;
-import org.apache.ignite.internal.tx.TxState;
import org.apache.ignite.internal.tx.storage.state.TxStateTableStorage;
import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.lang.IgniteInternalException;
@@ -244,7 +243,7 @@ public class InternalTableImpl implements InternalTable {
) {
final boolean implicit = tx == null;
- if (!implicit && tx.state() != null && tx.state() != TxState.PENDING) {
+ if (!implicit && tx.state() != null) {
return failedFuture(new TransactionException(
"The operation is attempted for completed transaction"));
}
diff --git a/modules/transactions/README.md b/modules/transactions/README.md
index 95607a890e..aebc74c16b 100644
--- a/modules/transactions/README.md
+++ b/modules/transactions/README.md
@@ -1,3 +1,6 @@
+The most recent version of the transaction protocol is described in the
+[IEP-91: Transaction
protocol](https://cwiki.apache.org/confluence/display/IGNITE/IEP-91%3A+Transaction+protocol)
+
# Ignite transactions
This module provides transactions support for cross partition operations.
Using the transactions, such operations are
executed in atomic way (either all changes all applied, or nothing at all)
with a strong isolation.
@@ -71,7 +74,7 @@ This functionality should be implemented by LockManager.
# Tx metadata
Each node maintains a persistent tx map:
-txid -> txstate(PENDING|ABORTED|COMMITED)
+txid -> txstate(ABORTED|COMMITED)
This map is used for a failover and for reading. Oldest entries in txid map
must be cleaned to avoid unlimited grow.
@@ -141,7 +144,6 @@ Tx client TxCoordinator
tx.start
--------->
assign timestamp = ts
- txstate = PENDING
<---------
table.put(k,v)
--------->
@@ -149,7 +151,6 @@ table.put(k,v)
lh = getLeaseholder(partition(k))
send UpsertCommand(k,ts) to lh
------------>
-
replicate txstate = PENDING
lockManager.tryAcquire(k,ts);
wait for completion async
prewrite(k,v,oldV,ts) -- replicate to all replicas
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxManager.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxManager.java
index b40e22bd99..992ff77bd6 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxManager.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxManager.java
@@ -17,7 +17,6 @@
package org.apache.ignite.internal.tx;
-import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -62,34 +61,6 @@ public interface TxManager extends IgniteComponent {
@Deprecated
boolean changeState(UUID txId, @Nullable TxState before, TxState after);
- /**
- * Acqures a write lock.
- *
- * @param lockId Table ID.
- * @param keyData The key data.
- * @param txId Transaction id.
- * @return The future.
- * @throws LockException When a lock can't be taken due to possible
deadlock.
- *
- * @deprecated @see LockManager#acquire(java.util.UUID,
org.apache.ignite.internal.tx.LockKey, org.apache.ignite.internal.tx.LockMode)
- */
- @Deprecated
- public CompletableFuture<Lock> writeLock(UUID lockId, ByteBuffer keyData,
UUID txId);
-
- /**
- * Acqures a read lock.
- *
- * @param lockId Lock id.
- * @param keyData The key data.
- * @param txId Transaction id.
- * @return The future.
- * @throws LockException When a lock can't be taken due to possible
deadlock.
- *
- * @deprecated @see LockManager#acquire(java.util.UUID,
org.apache.ignite.internal.tx.LockKey, org.apache.ignite.internal.tx.LockMode)
- */
- @Deprecated
- public CompletableFuture<Lock> readLock(UUID lockId, ByteBuffer keyData,
UUID txId);
-
/**
* Returns lock manager.
*
diff --git
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxState.java
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxState.java
index 2321798ff7..ae4ff4ff20 100644
---
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxState.java
+++
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TxState.java
@@ -21,7 +21,6 @@ package org.apache.ignite.internal.tx;
* Transaction state.
*/
public enum TxState {
- PENDING,
ABORTED,
COMMITED;
}
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 95a5f2186d..de5a1fddb2 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
@@ -18,9 +18,7 @@
package org.apache.ignite.internal.tx.impl;
import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.failedFuture;
-import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -30,10 +28,7 @@ import org.apache.ignite.hlc.HybridClock;
import org.apache.ignite.hlc.HybridTimestamp;
import org.apache.ignite.internal.replicator.ReplicaService;
import org.apache.ignite.internal.tx.InternalTransaction;
-import org.apache.ignite.internal.tx.Lock;
-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.Timestamp;
import org.apache.ignite.internal.tx.TxManager;
import org.apache.ignite.internal.tx.TxState;
@@ -41,7 +36,6 @@ import
org.apache.ignite.internal.tx.message.TxFinishReplicaRequest;
import org.apache.ignite.internal.tx.message.TxMessagesFactory;
import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.network.ClusterNode;
-import org.apache.ignite.tx.TransactionException;
import org.jetbrains.annotations.TestOnly;
/**
@@ -84,8 +78,6 @@ public class TxManagerImpl implements TxManager {
public InternalTransaction begin() {
UUID txId = Timestamp.nextVersion().toUuid();
- states.put(txId, TxState.PENDING);
-
return new TransactionImpl(this, txId);
}
@@ -99,7 +91,7 @@ public class TxManagerImpl implements TxManager {
@Override
public boolean changeState(UUID txId, TxState before, TxState after) {
return states.compute(txId, (k, v) -> {
- if (v == null || v == before) {
+ if (v == before) {
return after;
} else {
return v;
@@ -107,38 +99,6 @@ public class TxManagerImpl implements TxManager {
}) == after;
}
- /** {@inheritDoc} */
- @Override
- public CompletableFuture<Lock> writeLock(UUID lockId, ByteBuffer keyData,
UUID txId) {
- // TODO IGNITE-15933 process tx messages in strips to avoid races. But
locks can be acquired from any thread !
- TxState state = state(txId);
-
- if (state != null && state != TxState.PENDING) {
- return failedFuture(new TransactionException(
- "The operation is attempted for completed transaction"));
- }
-
- // Should rollback tx on lock error.
- LockKey lockKey = new LockKey(lockId, keyData);
-
- return lockManager.acquire(txId, lockKey, LockMode.X);
- }
-
- /** {@inheritDoc} */
- @Override
- public CompletableFuture<Lock> readLock(UUID lockId, ByteBuffer keyData,
UUID txId) {
- TxState state = state(txId);
-
- if (state != null && state != TxState.PENDING) {
- return failedFuture(new TransactionException(
- "The operation is attempted for completed transaction"));
- }
-
- LockKey lockKey = new LockKey(lockId, keyData);
-
- return lockManager.acquire(txId, lockKey, LockMode.S);
- }
-
/** {@inheritDoc} */
@Override
public CompletableFuture<Void> finish(
@@ -163,7 +123,7 @@ public class TxManagerImpl implements TxManager {
return replicaService.invoke(recipientNode, req)
// TODO: IGNITE-17638 TestOnly code, let's consider using Txn
state map instead of states.
- .thenRun(() -> changeState(txId, TxState.PENDING, commit ?
TxState.COMMITED : TxState.ABORTED));
+ .thenRun(() -> changeState(txId, null, commit ?
TxState.COMMITED : TxState.ABORTED));
}
/** {@inheritDoc} */
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 80c4587bb6..63e38565f9 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
@@ -73,7 +73,6 @@ public class TxManagerTest extends IgniteAbstractTest {
InternalTransaction tx = txManager.begin();
assertNotNull(tx.id());
- assertEquals(TxState.PENDING, txManager.begin().state());
}
@Test
diff --git
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
index 30c8778cdd..7d68b1e3b6 100644
---
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
+++
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
@@ -61,12 +61,12 @@ public abstract class TxStateStorageAbstractTest {
txIds.add(txId);
- storage.put(txId, new TxMeta(TxState.PENDING,
generateEnlistedPartitions(i), generateTimestamp(txId)));
+ storage.put(txId, new TxMeta(TxState.COMMITED,
generateEnlistedPartitions(i), generateTimestamp(txId)));
}
for (int i = 0; i < 100; i++) {
TxMeta txMeta = storage.get(txIds.get(i));
- TxMeta txMetaExpected = new TxMeta(TxState.PENDING,
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
+ TxMeta txMetaExpected = new TxMeta(TxState.COMMITED,
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
assertTxMetaEquals(txMetaExpected, txMeta);
}
@@ -82,7 +82,7 @@ public abstract class TxStateStorageAbstractTest {
assertNull(txMeta);
} else {
TxMeta txMeta = storage.get(txIds.get(i));
- TxMeta txMetaExpected = new TxMeta(TxState.PENDING,
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
+ TxMeta txMetaExpected = new TxMeta(TxState.COMMITED,
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
assertTxMetaEquals(txMetaExpected, txMeta);
}
}
@@ -111,33 +111,30 @@ public abstract class TxStateStorageAbstractTest {
UUID txId = UUID.randomUUID();
- TxMeta txMeta0 = new TxMeta(TxState.PENDING, new ArrayList<>(),
generateTimestamp(txId));
TxMeta txMeta1 = new TxMeta(TxState.COMMITED, new ArrayList<>(),
generateTimestamp(txId));
TxMeta txMeta2 = new TxMeta(TxState.COMMITED, new ArrayList<>(),
generateTimestamp(UUID.randomUUID()));
- assertTrue(storage.compareAndSet(txId, null, txMeta0, 1));
+ assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
// Checking idempotency.
- assertTrue(storage.compareAndSet(txId, null, txMeta0, 1));
- assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta0,
1));
+ assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
+ assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta1,
1));
TxMeta txMetaWrongTimestamp0 =
- new TxMeta(txMeta0.txState(),
txMeta0.enlistedPartitions(), generateTimestamp(UUID.randomUUID()));
- assertFalse(storage.compareAndSet(txId, null,
txMetaWrongTimestamp0, 1));
+ new TxMeta(txMeta1.txState(),
txMeta1.enlistedPartitions(), generateTimestamp(UUID.randomUUID()));
+ assertFalse(storage.compareAndSet(txId, TxState.ABORTED,
txMetaWrongTimestamp0, 1));
- TxMeta txMetaNullTimestamp0 = new TxMeta(txMeta0.txState(),
txMeta0.enlistedPartitions(), null);
+ TxMeta txMetaNullTimestamp0 = new TxMeta(txMeta1.txState(),
txMeta1.enlistedPartitions(), null);
assertFalse(storage.compareAndSet(txId, TxState.ABORTED,
txMetaNullTimestamp0, 3));
- assertTxMetaEquals(storage.get(txId), txMeta0);
+ assertTxMetaEquals(storage.get(txId), txMeta1);
- assertFalse(storage.compareAndSet(txId, txMeta1.txState(),
txMeta2, 2));
- assertTrue(storage.compareAndSet(txId, txMeta0.txState(), txMeta2,
3));
+ assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2,
3));
// Checking idempotency.
- assertTrue(storage.compareAndSet(txId, txMeta0.txState(), txMeta2,
3));
+ assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2,
3));
assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta2,
3));
TxMeta txMetaWrongTimestamp2 =
new TxMeta(txMeta2.txState(),
txMeta2.enlistedPartitions(), generateTimestamp(UUID.randomUUID()));
- assertFalse(storage.compareAndSet(txId, txMeta0.txState(),
txMetaWrongTimestamp2, 3));
TxMeta txMetaNullTimestamp2 = new TxMeta(txMeta2.txState(),
txMeta2.enlistedPartitions(), null);
assertFalse(storage.compareAndSet(txId, TxState.ABORTED,
txMetaNullTimestamp2, 3));
@@ -188,10 +185,10 @@ public abstract class TxStateStorageAbstractTest {
TxStateStorage storage1 =
tableStorage.getOrCreateTxStateStorage(1);
UUID txId0 = UUID.randomUUID();
- storage0.put(txId0, new TxMeta(TxState.PENDING,
generateEnlistedPartitions(1), generateTimestamp(txId0)));
+ storage0.put(txId0, new TxMeta(TxState.COMMITED,
generateEnlistedPartitions(1), generateTimestamp(txId0)));
UUID txId1 = UUID.randomUUID();
- storage1.put(txId1, new TxMeta(TxState.PENDING,
generateEnlistedPartitions(1), generateTimestamp(txId1)));
+ storage1.put(txId1, new TxMeta(TxState.COMMITED,
generateEnlistedPartitions(1), generateTimestamp(txId1)));
storage0.destroy();
@@ -201,7 +198,7 @@ public abstract class TxStateStorageAbstractTest {
private IgniteBiTuple<UUID, TxMeta>
putRandomTxMetaWithCommandIndex(TxStateStorage storage, int enlistedPartsCount,
long commandIndex) {
UUID txId = UUID.randomUUID();
- TxMeta txMeta = new TxMeta(TxState.PENDING,
generateEnlistedPartitions(enlistedPartsCount), generateTimestamp(txId));
+ TxMeta txMeta = new TxMeta(null,
generateEnlistedPartitions(enlistedPartsCount), generateTimestamp(txId));
storage.compareAndSet(txId, null, txMeta, commandIndex);
return new IgniteBiTuple<>(txId, txMeta);