tkalkirill commented on code in PR #1938:
URL: https://github.com/apache/ignite-3/pull/1938#discussion_r1169542976


##########
modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReadOnlyTransactionImpl.java:
##########
@@ -17,85 +17,84 @@
 
 package org.apache.ignite.internal.tx.impl;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
+
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.replicator.ReplicationGroupId;
-import org.apache.ignite.internal.tx.TxManager;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.network.ClusterNode;
-import org.jetbrains.annotations.NotNull;
 
 /**
  * The read-only implementation of an internal transaction.
  */
-public class ReadOnlyTransactionImpl extends IgniteAbstractTransactionImpl {
+class ReadOnlyTransactionImpl extends IgniteAbstractTransactionImpl {
     /** The read timestamp. */
     private final HybridTimestamp readTimestamp;
 
+    /** Prevents double finish of the transaction. */
+    private final AtomicBoolean finishGuard = new AtomicBoolean();
+
     /**
      * The constructor.
      *
      * @param txManager The tx manager.
      * @param id The id.
      * @param readTimestamp The read timestamp.
      */
-    public ReadOnlyTransactionImpl(
-            TxManager txManager,
-            @NotNull UUID id,
-            HybridTimestamp readTimestamp
-    ) {
+    ReadOnlyTransactionImpl(TxManagerImpl txManager, UUID id, HybridTimestamp 
readTimestamp) {
         super(txManager, id);
+
         this.readTimestamp = readTimestamp;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isReadOnly() {
         return true;
     }
 
-    /** {@inheritDoc} */
     @Override
     public HybridTimestamp readTimestamp() {
         return readTimestamp;
     }
 
-    /** {@inheritDoc} */
     @Override
     public IgniteBiTuple<ClusterNode, Long> enlist(ReplicationGroupId 
replicationGroupId, IgniteBiTuple<ClusterNode, Long> nodeAndTerm) {
         // TODO: IGNITE-17666 Close cursor tx finish and do it on the first 
finish invocation only.
         return null;
     }
 
-    /** {@inheritDoc} */
     @Override
     public IgniteBiTuple<ClusterNode, Long> 
enlistedNodeAndTerm(ReplicationGroupId replicationGroupId) {
         return null;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean assignCommitPartition(ReplicationGroupId 
replicationGroupId) {
         return true;
     }
 
-    /** {@inheritDoc} */
     @Override
     public ReplicationGroupId commitPartition() {
         return null;
     }
 
-    /** {@inheritDoc} */
     @Override
     public void enlistResultFuture(CompletableFuture<?> resultFuture) {
         // No-op.
     }
 
-    /** {@inheritDoc} */
     @Override
+    // TODO: IGNITE-17666 Close cursor tx finish and do it on the first finish 
invocation only.
     protected CompletableFuture<Void> finish(boolean commit) {
-        // TODO: IGNITE-17666 Close cursor tx finish and do it on the first 
finish invocation only.
-        return CompletableFuture.completedFuture(null);
+        if (!finishGuard.compareAndSet(false, true)) {
+            return completedFuture(null);
+        }
+
+        ((TxManagerImpl) 
txManager).completeReadOnlyTransactionFuture(readTimestamp);
+
+        return completedFuture(null);

Review Comment:
   It doesn't matter to me, let the future return.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to