offsets, boolean closing, int seqno) {
+ if (isCancelled()) {
+ log.debug("Skipping final offset commit as task has been cancelled");
+ return;
+ }
if (closing) {
doCommitSync(offsets, seqno);
} else {
diff --git a/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/WorkerSourceTask.java b/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/WorkerSourceTask.java
index 37d93a3fe86..a8fc73d7bba 100644
--- a/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/WorkerSourceTask.java
+++ b/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/WorkerSourceTask.java
@@ -239,7 +239,19 @@ class WorkerSourceTask extends AbstractWorkerSourceTask {
// though we may update them here with newer offsets for acked records.
offsetsToCommit.offsets().forEach(offsetWriter::offset);
- if (!offsetWriter.beginFlush()) {
+ boolean shouldFlush;
+ try {
+ shouldFlush = offsetWriter.beginFlush(timeout - time.milliseconds(), TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ log.warn("{} Interrupted while waiting for previous offset flush to complete, cancelling", this);
+ recordCommitFailure(time.milliseconds() - started, e);
+ return false;
+ } catch (TimeoutException e) {
+ log.warn("{} Timed out while waiting for previous offset flush to complete, cancelling", this);
+ recordCommitFailure(time.milliseconds() - started, e);
+ return false;
+ }
+ if (!shouldFlush) {
// There was nothing in the offsets to process, but we still mark a successful offset commit.
long durationMillis = time.milliseconds() - started;
recordCommitSuccess(durationMillis);
diff --git a/connect/runtime/src/main/java/org/apache/kafka/connect/storage/OffsetStorageWriter.java b/connect/runtime/src/main/java/org/apache/kafka/connect/storage/OffsetStorageWriter.java
index b67e3d7b1b4..692669e7544 100644
--- a/connect/runtime/src/main/java/org/apache/kafka/connect/storage/OffsetStorageWriter.java
+++ b/connect/runtime/src/main/java/org/apache/kafka/connect/storage/OffsetStorageWriter.java
@@ -26,6 +26,9 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
/**
*
@@ -73,6 +76,7 @@ public class OffsetStorageWriter {
private Map