You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by ce...@apache.org on 2022/07/28 20:44:28 UTC
[kafka] branch trunk updated: KAFKA-14012: Add warning to closeQuietly documentation about method references of null objects (#12321)
This is an automated email from the ASF dual-hosted git repository.
cegerton pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new 3ddb62316f KAFKA-14012: Add warning to closeQuietly documentation about method references of null objects (#12321)
3ddb62316f is described below
commit 3ddb62316f287d74b9649e1821c62fe8f68bc6e6
Author: vamossagar12 <sa...@gmail.com>
AuthorDate: Fri Jul 29 02:14:19 2022 +0530
KAFKA-14012: Add warning to closeQuietly documentation about method references of null objects (#12321)
Reviewers: Kvicii <42...@users.noreply.github.com>, Chris Egerton <fe...@gmail.com>
---
.../java/org/apache/kafka/common/utils/Utils.java | 19 +++++++++++++++++++
.../connect/runtime/AbstractWorkerSourceTask.java | 3 ++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/clients/src/main/java/org/apache/kafka/common/utils/Utils.java b/clients/src/main/java/org/apache/kafka/common/utils/Utils.java
index af71e3ecd3..7d84167cf2 100755
--- a/clients/src/main/java/org/apache/kafka/common/utils/Utils.java
+++ b/clients/src/main/java/org/apache/kafka/common/utils/Utils.java
@@ -998,6 +998,14 @@ public final class Utils {
/**
* Closes {@code closeable} and if an exception is thrown, it is logged at the WARN level.
+ * <b>Be cautious when passing method references as an argument.</b> For example:
+ * <p>
+ * {@code closeQuietly(task::stop, "source task");}
+ * <p>
+ * Although this method gracefully handles null {@link AutoCloseable} objects, attempts to take a method
+ * reference from a null object will result in a {@link NullPointerException}. In the example code above,
+ * it would be the caller's responsibility to ensure that {@code task} was non-null before attempting to
+ * use a method reference from it.
*/
public static void closeQuietly(AutoCloseable closeable, String name) {
if (closeable != null) {
@@ -1009,6 +1017,17 @@ public final class Utils {
}
}
+ /**
+ * Closes {@code closeable} and if an exception is thrown, it is registered to the firstException parameter.
+ * <b>Be cautious when passing method references as an argument.</b> For example:
+ * <p>
+ * {@code closeQuietly(task::stop, "source task");}
+ * <p>
+ * Although this method gracefully handles null {@link AutoCloseable} objects, attempts to take a method
+ * reference from a null object will result in a {@link NullPointerException}. In the example code above,
+ * it would be the caller's responsibility to ensure that {@code task} was non-null before attempting to
+ * use a method reference from it.
+ */
public static void closeQuietly(AutoCloseable closeable, String name, AtomicReference<Throwable> firstException) {
if (closeable != null) {
try {
diff --git a/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/AbstractWorkerSourceTask.java b/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/AbstractWorkerSourceTask.java
index a2a3fce9fe..693ef510f1 100644
--- a/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/AbstractWorkerSourceTask.java
+++ b/connect/runtime/src/main/java/org/apache/kafka/connect/runtime/AbstractWorkerSourceTask.java
@@ -59,6 +59,7 @@ import org.slf4j.LoggerFactory;
import java.time.Duration;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
@@ -235,7 +236,7 @@ public abstract class AbstractWorkerSourceTask extends WorkerTask {
this.admin = admin;
this.offsetReader = offsetReader;
this.offsetWriter = offsetWriter;
- this.offsetStore = offsetStore;
+ this.offsetStore = Objects.requireNonNull(offsetStore, "offset store cannot be null for source tasks");
this.closeExecutor = closeExecutor;
this.sourceTaskContext = sourceTaskContext;