This is an automated email from the ASF dual-hosted git repository.
chia7712 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 9c9f1446a16 KAFKA-18061 AddRaftVoter responds with error message
"NONE" instead of null (#17930)
9c9f1446a16 is described below
commit 9c9f1446a16124c177bf7412869e14ded9032f88
Author: Linsiyuan9 <[email protected]>
AuthorDate: Tue Sep 9 13:58:10 2025 +0800
KAFKA-18061 AddRaftVoter responds with error message "NONE" instead of null
(#17930)
In `RaftUtil.addVoterResponse` and `RaftUtil.removeVoterResponse`
methods, when the input `errorMessage` is `null`, the returned string is
not actually null but `NONE`.
This introduces an inconsistency: semantically, `null` should represent
“no error message,” while `NONE` looks like a real string value and may
confuse clients.
Reviewers: Alyssa Huang <[email protected]>, José Armando García
Sancio <[email protected]>, Anton Agestam <[email protected]>,
Chia-Ping Tsai <[email protected]>
---
.../main/java/org/apache/kafka/raft/RaftUtil.java | 12 +++++++----
.../apache/kafka/raft/RaftClientTestContext.java | 17 +++++++++++----
.../java/org/apache/kafka/raft/RaftUtilTest.java | 25 ++++++++++++++++++++++
3 files changed, 46 insertions(+), 8 deletions(-)
diff --git a/raft/src/main/java/org/apache/kafka/raft/RaftUtil.java
b/raft/src/main/java/org/apache/kafka/raft/RaftUtil.java
index f3f411885a7..d3a4f760968 100644
--- a/raft/src/main/java/org/apache/kafka/raft/RaftUtil.java
+++ b/raft/src/main/java/org/apache/kafka/raft/RaftUtil.java
@@ -542,8 +542,10 @@ public class RaftUtil {
Errors error,
String errorMessage
) {
- errorMessage = errorMessage == null ? error.message() : errorMessage;
-
+ // return the provided errorMessage if it exists, Errors.NONE should
have a null message
+ if (errorMessage == null && error != Errors.NONE) {
+ errorMessage = error.message();
+ }
return new AddRaftVoterResponseData()
.setErrorCode(error.code())
.setErrorMessage(errorMessage);
@@ -563,8 +565,10 @@ public class RaftUtil {
Errors error,
String errorMessage
) {
- errorMessage = errorMessage == null ? error.message() : errorMessage;
-
+ // return the provided errorMessage if it exists, Errors.NONE should
have a null message
+ if (errorMessage == null && error != Errors.NONE) {
+ errorMessage = error.message();
+ }
return new RemoveRaftVoterResponseData()
.setErrorCode(error.code())
.setErrorMessage(errorMessage);
diff --git
a/raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java
b/raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java
index a98fb79d09a..42fdde0fa0e 100644
--- a/raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java
+++ b/raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java
@@ -108,6 +108,7 @@ 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.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
public final class RaftClientTestContext {
@@ -1341,8 +1342,12 @@ public final class RaftClientTestContext {
assertInstanceOf(AddRaftVoterResponseData.class, response.data());
AddRaftVoterResponseData addVoterResponse = (AddRaftVoterResponseData)
response.data();
- assertEquals(error, Errors.forCode(addVoterResponse.errorCode()));
-
+ if (Errors.NONE.equals(error)) {
+ assertEquals(error, Errors.forCode(addVoterResponse.errorCode()));
+ assertNull(addVoterResponse.errorMessage());
+ } else {
+ assertEquals(error, Errors.forCode(addVoterResponse.errorCode()));
+ }
return addVoterResponse;
}
@@ -1371,8 +1376,12 @@ public final class RaftClientTestContext {
assertInstanceOf(RemoveRaftVoterResponseData.class, response.data());
RemoveRaftVoterResponseData removeVoterResponse =
(RemoveRaftVoterResponseData) response.data();
- assertEquals(error, Errors.forCode(removeVoterResponse.errorCode()));
-
+ if (Errors.NONE.equals(error)) {
+ assertEquals(error,
Errors.forCode(removeVoterResponse.errorCode()));
+ assertNull(removeVoterResponse.errorMessage());
+ } else {
+ assertEquals(error,
Errors.forCode(removeVoterResponse.errorCode()));
+ }
return removeVoterResponse;
}
diff --git a/raft/src/test/java/org/apache/kafka/raft/RaftUtilTest.java
b/raft/src/test/java/org/apache/kafka/raft/RaftUtilTest.java
index cdbd728cb1e..5aacab01df6 100644
--- a/raft/src/test/java/org/apache/kafka/raft/RaftUtilTest.java
+++ b/raft/src/test/java/org/apache/kafka/raft/RaftUtilTest.java
@@ -72,6 +72,7 @@ import java.util.Map;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class RaftUtilTest {
@@ -646,6 +647,30 @@ public class RaftUtilTest {
);
}
+ @Test
+ public void testAddVoterResponse() {
+ for (Errors error : Errors.values()) {
+ AddRaftVoterResponseData addRaftVoterResponseData =
RaftUtil.addVoterResponse(error, null);
+ assertEquals(error.code(), addRaftVoterResponseData.errorCode());
+ if (Errors.NONE.equals(error))
+ assertNull(addRaftVoterResponseData.errorMessage());
+ else
+ assertEquals(error.message(),
addRaftVoterResponseData.errorMessage());
+ }
+ }
+
+ @Test
+ public void testRemoveVoterResponse() {
+ for (Errors error : Errors.values()) {
+ RemoveRaftVoterResponseData removeRaftVoterResponseData =
RaftUtil.removeVoterResponse(error, null);
+ assertEquals(error.code(),
removeRaftVoterResponseData.errorCode());
+ if (Errors.NONE.equals(error))
+ assertNull(removeRaftVoterResponseData.errorMessage());
+ else
+ assertEquals(error.message(),
removeRaftVoterResponseData.errorMessage());
+ }
+ }
+
private Records createRecords() {
ByteBuffer allocate = ByteBuffer.allocate(1024);