yws created KAFKA-14421:
---------------------------
Summary: OffsetFetchRequest throws NPE Exception
Key: KAFKA-14421
URL: https://issues.apache.org/jira/browse/KAFKA-14421
Project: Kafka
Issue Type: Bug
Components: clients
Affects Versions: 0.10.2.2, 0.10.2.1, 0.10.2.0
Reporter: yws
Attachments: image-2022-11-27-22-28-52-165.png,
image-2022-11-27-22-41-45-358.png
when I use 0.10.2 client send Metadata request to 0.10.0 server, NPE
exception happens,
!image-2022-11-27-22-28-52-165.png!
the NPE exception quite confused me, because if just send Metadata request
doest not cause the NPE exception occurs, after troubleshooting the problem, It
is the NetworkClient#poll call ConsumerNetworkClient#trySend and further call
NetworkClient#doSend when trying to build OffsetFetchRequest, because the
0.10.0 server doest not support fetch all TopicPartitions, it throw
UnsupportedVersionException,
{code:java}
private void doSend(ClientRequest clientRequest, boolean isInternalRequest,
long now) {
String nodeId = clientRequest.destination();
......
AbstractRequest request = null;
AbstractRequest.Builder<?> builder = clientRequest.requestBuilder();
try {
NodeApiVersions versionInfo = nodeApiVersions.get(nodeId);
// Note: if versionInfo is null, we have no server version
information. This would be
// the case when sending the initial ApiVersionRequest which
fetches the version
// information itself. It is also the case when
discoverBrokerVersions is set to false.
if (versionInfo == null) {
if (discoverBrokerVersions && log.isTraceEnabled())
log.trace("No version information found when sending
message of type {} to node {}. " +
"Assuming version {}.", clientRequest.apiKey(),
nodeId, builder.version());
} else {
short version =
versionInfo.usableVersion(clientRequest.apiKey());
builder.setVersion(version);
}
// The call to build may also throw UnsupportedVersionException, if
there are essential
// fields that cannot be represented in the chosen version.
request = builder.build();
} catch (UnsupportedVersionException e) {
// If the version is not supported, skip sending the request over
the wire.
// Instead, simply add it to the local queue of aborted requests.
log.debug("Version mismatch when attempting to send {} to {}",
clientRequest.toString(), clientRequest.destination(), e);
ClientResponse clientResponse = new
ClientResponse(clientRequest.makeHeader(),
clientRequest.callback(), clientRequest.destination(), now,
now,
false, e, null);
abortedSends.add(clientResponse);
return;
}
{code}
!image-2022-11-27-22-41-45-358.png!
until now, all are expected, but unfortunately, in catch
UnsupportedVersionException code block, clientRequest.toString need to call
requestBuilder#toString, that is OffsetFetchRequest's Builder#toString, when
partition is ALL_TOPIC_PARTITIONS, it is null, therefore it cause the
unexpected NPE, and make the normal MetadataRequest failed..
{code:java}
catch (UnsupportedVersionException e) {
log.debug("Version mismatch when attempting to send {} to {}",
clientRequest.toString(), clientRequest.destination(), e);
ClientResponse clientResponse = new
ClientResponse(clientRequest.makeHeader(),
clientRequest.callback(), clientRequest.destination(), now,
now,
false, e, null);
abortedSends.add(clientResponse);
return;
}
ClientRequest#toString()
public String toString() {
return "ClientRequest(expectResponse=" + expectResponse +
", callback=" + callback +
", destination=" + destination +
", correlationId=" + correlationId +
", clientId=" + clientId +
", createdTimeMs=" + createdTimeMs +
", requestBuilder=" + requestBuilder +
")";
}
OffsetFetchRequest's Builder#toString
public String toString() {
StringBuilder bld = new StringBuilder();
bld.append("(type=OffsetFetchRequest, ").
append("groupId=").append(groupId).
append(", partitions=").append(Utils.join(partitions,
",")). // cause NPE
append(")");
return bld.toString();
}
{code}
I think the NPE is unexpected, when broker doest not support specific protocal,
It should not throw NPE instead of UnsupportedVersionException, and I find in
0.11 or later version
it is fixed, but the OffsetFetchRequest support ALL_TOPIC_PARTITIONS is
introduced in 0.10.2
[kIP88|https://cwiki.apache.org/confluence/display/KAFKA/KIP-88%3A+OffsetFetch+Protocol+Update],
Therefore, I think it should also be fixed in 0.10.2 client
look forward to any reply , Thanks~
--
This message was sent by Atlassian Jira
(v8.20.10#820010)