This is an automated email from the ASF dual-hosted git repository.

tison pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 713b0b170bf [FLINK-28085][Connector/Pulsar] Close the pending Pulsar 
transactions before closing pipeline (#21075)
713b0b170bf is described below

commit 713b0b170bf3d8d13b1663e73c1e9d6f100da731
Author: Yufan Sheng <[email protected]>
AuthorDate: Tue Oct 18 20:23:24 2022 +0800

    [FLINK-28085][Connector/Pulsar] Close the pending Pulsar transactions 
before closing pipeline (#21075)
---
 .../common/utils/PulsarTransactionUtils.java       |  2 ++
 .../reader/fetcher/PulsarFetcherManagerBase.java   | 12 ++++++++++
 .../reader/source/PulsarOrderedSourceReader.java   |  3 +++
 .../reader/source/PulsarSourceReaderBase.java      |  7 ++++++
 .../reader/source/PulsarUnorderedSourceReader.java | 27 ++++++++++++++++++++++
 .../split/PulsarUnorderedPartitionSplitReader.java | 14 +++++++----
 6 files changed, 61 insertions(+), 4 deletions(-)

diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/common/utils/PulsarTransactionUtils.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/common/utils/PulsarTransactionUtils.java
index a48b4d4a7bf..c8ffe6387fd 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/common/utils/PulsarTransactionUtils.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/common/utils/PulsarTransactionUtils.java
@@ -60,6 +60,8 @@ public final class PulsarTransactionUtils {
     /**
      * This is a bug in original {@link 
TransactionCoordinatorClientException#unwrap(Throwable)}
      * method. Pulsar wraps the {@link ExecutionException} which hides the 
real execution exception.
+     *
+     * <p>This bug should be fixed after the 2.10.0 release. We just keep this 
for safety.
      */
     public static TransactionCoordinatorClientException unwrap(
             TransactionCoordinatorClientException e) {
diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/fetcher/PulsarFetcherManagerBase.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/fetcher/PulsarFetcherManagerBase.java
index 6abb8bd70fc..1622eee33b8 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/fetcher/PulsarFetcherManagerBase.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/fetcher/PulsarFetcherManagerBase.java
@@ -86,6 +86,18 @@ public abstract class PulsarFetcherManagerBase<T>
         }
     }
 
+    /** Close the finished split related fetcher. */
+    public void closeFetcher(String splitId) {
+        Integer fetchId = splitFetcherMapping.remove(splitId);
+        if (fetchId != null) {
+            fetcherStatus.remove(fetchId);
+            SplitFetcher<PulsarMessage<T>, PulsarPartitionSplit> fetcher = 
fetchers.remove(fetchId);
+            if (fetcher != null) {
+                fetcher.shutdown();
+            }
+        }
+    }
+
     protected SplitFetcher<PulsarMessage<T>, PulsarPartitionSplit> 
getOrCreateFetcher(
             String splitId) {
         SplitFetcher<PulsarMessage<T>, PulsarPartitionSplit> fetcher;
diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarOrderedSourceReader.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarOrderedSourceReader.java
index a06d8a47a25..6ff04666cca 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarOrderedSourceReader.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarOrderedSourceReader.java
@@ -109,6 +109,9 @@ public class PulsarOrderedSourceReader<OUT> extends 
PulsarSourceReaderBase<OUT>
 
     @Override
     protected void onSplitFinished(Map<String, PulsarPartitionSplitState> 
finishedSplitIds) {
+        // Close all the finished splits.
+        closeFinishedSplits(finishedSplitIds.keySet());
+
         // We don't require new splits, all the splits are pre-assigned by 
source enumerator.
         if (LOG.isDebugEnabled()) {
             LOG.debug("onSplitFinished event: {}", finishedSplitIds);
diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarSourceReaderBase.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarSourceReaderBase.java
index c910e9461c9..eee6950af7c 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarSourceReaderBase.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarSourceReaderBase.java
@@ -33,6 +33,7 @@ import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.api.PulsarClient;
 
 import java.util.Collection;
+import java.util.Set;
 
 /**
  * The common pulsar source reader for both ordered & unordered message 
consuming.
@@ -92,4 +93,10 @@ abstract class PulsarSourceReaderBase<OUT>
         pulsarClient.shutdown();
         pulsarAdmin.close();
     }
+
+    protected void closeFinishedSplits(Set<String> finishedSplitIds) {
+        for (String splitId : finishedSplitIds) {
+            ((PulsarFetcherManagerBase<OUT>) 
splitFetcherManager).closeFetcher(splitId);
+        }
+    }
 }
diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarUnorderedSourceReader.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarUnorderedSourceReader.java
index 1767210b9ff..3bb4bc61b0a 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarUnorderedSourceReader.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/source/PulsarUnorderedSourceReader.java
@@ -118,6 +118,9 @@ public class PulsarUnorderedSourceReader<OUT> extends 
PulsarSourceReaderBase<OUT
 
     @Override
     protected void onSplitFinished(Map<String, PulsarPartitionSplitState> 
finishedSplitIds) {
+        // Close all the finished splits.
+        closeFinishedSplits(finishedSplitIds.keySet());
+
         // We don't require new splits, all the splits are pre-assigned by 
source enumerator.
         if (LOG.isDebugEnabled()) {
             LOG.debug("onSplitFinished event: {}", finishedSplitIds);
@@ -151,6 +154,11 @@ public class PulsarUnorderedSourceReader<OUT> extends 
PulsarSourceReaderBase<OUT
                     txnIDs.add(uncommittedTransactionId);
                 }
             }
+
+            // Add finished splits' transactions.
+            txnIDs.addAll(transactionsOfFinishedSplits);
+            // Purge the transactions.
+            transactionsOfFinishedSplits.clear();
         }
 
         return splits;
@@ -177,4 +185,23 @@ public class PulsarUnorderedSourceReader<OUT> extends 
PulsarSourceReaderBase<OUT
             }
         }
     }
+
+    @Override
+    public void close() throws Exception {
+        // Abort all the pending transactions.
+        if (coordinatorClient != null) {
+            for (List<TxnID> transactions : transactionsToCommit.values()) {
+                for (TxnID transaction : transactions) {
+                    try {
+                        coordinatorClient.abort(transaction);
+                    } catch (Exception e) {
+                        LOG.warn("Error in aborting transaction {}", 
transaction, e);
+                    }
+                }
+            }
+        }
+
+        // Close the pulsar client finally.
+        super.close();
+    }
 }
diff --git 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/split/PulsarUnorderedPartitionSplitReader.java
 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/split/PulsarUnorderedPartitionSplitReader.java
index b5809ef9b7b..02fd8d9484e 100644
--- 
a/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/split/PulsarUnorderedPartitionSplitReader.java
+++ 
b/flink-connectors/flink-connector-pulsar/src/main/java/org/apache/flink/connector/pulsar/source/reader/split/PulsarUnorderedPartitionSplitReader.java
@@ -33,6 +33,7 @@ import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.transaction.Transaction;
 import org.apache.pulsar.client.api.transaction.TransactionCoordinatorClient;
 import 
org.apache.pulsar.client.api.transaction.TransactionCoordinatorClientException;
+import 
org.apache.pulsar.client.api.transaction.TransactionCoordinatorClientException.TransactionNotFoundException;
 import org.apache.pulsar.client.api.transaction.TxnID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,6 +47,7 @@ import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.flink.connector.pulsar.common.utils.PulsarExceptionUtils.sneakyClient;
 import static 
org.apache.flink.connector.pulsar.common.utils.PulsarTransactionUtils.createTransaction;
+import static 
org.apache.flink.connector.pulsar.common.utils.PulsarTransactionUtils.unwrap;
 
 /**
  * The split reader a given {@link PulsarPartitionSplit}, it would be closed 
once the {@link
@@ -124,10 +126,14 @@ public class PulsarUnorderedPartitionSplitReader<OUT> 
extends PulsarPartitionSpl
                 try {
                     coordinatorClient.abort(uncommittedTransactionId);
                 } catch (TransactionCoordinatorClientException e) {
-                    LOG.error(
-                            "Failed to abort the uncommitted transaction {} 
when restart the reader",
-                            uncommittedTransactionId,
-                            e);
+                    TransactionCoordinatorClientException exception = 
unwrap(e);
+                    // The aborted transaction would return a not found 
exception.
+                    if (!(exception instanceof TransactionNotFoundException)) {
+                        LOG.error(
+                                "Failed to abort the uncommitted transaction 
{} when restart the reader",
+                                uncommittedTransactionId,
+                                e);
+                    }
                 }
             }
 

Reply via email to