You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "yws (Jira)" <ji...@apache.org> on 2022/11/28 06:18:00 UTC
[jira] [Comment Edited] (KAFKA-14421) OffsetFetchRequest throws NPE Exception
[ https://issues.apache.org/jira/browse/KAFKA-14421?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17639806#comment-17639806 ]
yws edited comment on KAFKA-14421 at 11/28/22 6:17 AM:
-------------------------------------------------------
[~showuon], thanks for your reply, it only affects 0.10.2 clients version, why not patch release for v0.10.2:( , if it is a bug, lots of users use it, why not fix it:D
was (Author: ws):
Luke Chen, thanks for your reply, it only affects 0.10.2 clients version, why not patch release for v0.10.2:( , if it is a bug, lots of users use it, why not fix it:D
> 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.0, 0.10.2.1, 0.10.2.2
> Reporter: yws
> Priority: Major
> 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)