YunKui Lu created KAFKA-13777:
---------------------------------
Summary: Fix FetchResponse#responseData: Assignment of
lazy-initialized members should be the last step with double-checked locking
Key: KAFKA-13777
URL: https://issues.apache.org/jira/browse/KAFKA-13777
Project: Kafka
Issue Type: Bug
Components: clients
Affects Versions: 3.0.1
Reporter: YunKui Lu
Assignment of lazy-initialized members should be the last step with
double-checked locking.
now:
{code:java}
public LinkedHashMap<TopicPartition, FetchResponseData.PartitionData>
responseData(Map<Uuid, String> topicNames, short version) {
if (responseData == null) {
synchronized (this) {
if (responseData == null) {
responseData = new LinkedHashMap<>();
data.responses().forEach(topicResponse -> {
String name;
if (version < 13) {
name = topicResponse.topic();
} else {
name = topicNames.get(topicResponse.topicId());
}
if (name != null) {
topicResponse.partitions().forEach(partition ->
responseData.put(new TopicPartition(name,
partition.partitionIndex()), partition));
}
});
}
}
}
return responseData;
} {code}
maybe should:
{code:java}
public LinkedHashMap<TopicPartition, FetchResponseData.PartitionData>
responseData(Map<Uuid, String> topicNames, short version) {
if (responseData == null) {
synchronized (this) {
if (responseData == null) {
// *** change 1 ***
final LinkedHashMap<TopicPartition,
FetchResponseData.PartitionData> responseDataTmp = new LinkedHashMap<>();
data.responses().forEach(topicResponse -> {
String name;
if (version < 13) {
name = topicResponse.topic();
} else {
name = topicNames.get(topicResponse.topicId());
}
if (name != null) {
topicResponse.partitions().forEach(partition ->
// *** change 2 ***
responseDataTmp.put(new
TopicPartition(name, partition.partitionIndex()), partition));
}
});
// *** change 3 ***
responseData = responseDataTmp;
}
}
}
return responseData;
} {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)