mirror of https://github.com/apache/kafka.git
KAFKA-3343; Use NoTimestamp in GroupMetadataManager when message v0 i…
…s used. Author: Jiangjie Qin <becket.qin@gmail.com> Reviewers: Ismael Juma <ismael@juma.me.uk>, Jun Rao <junrao@gmail.com> Closes #1023 from becketqin/KAFKA-3343
This commit is contained in:
parent
5afa166010
commit
c4282371d9
|
|
@ -143,8 +143,9 @@ class GroupMetadataManager(val brokerId: Int,
|
|||
// if we crash or leaders move) since the new leaders will still expire the consumers with heartbeat and
|
||||
// retry removing this group.
|
||||
val groupPartition = partitionFor(group.groupId)
|
||||
val (magicValue, timestamp) = getMessageFormatVersionAndTimestamp(groupPartition)
|
||||
val tombstone = new Message(bytes = null, key = GroupMetadataManager.groupMetadataKey(group.groupId),
|
||||
timestamp = time.milliseconds(), magicValue = getMessageFormatVersion(groupPartition))
|
||||
timestamp = timestamp, magicValue = magicValue)
|
||||
|
||||
val partitionOpt = replicaManager.getPartition(GroupCoordinator.GroupMetadataTopicName, groupPartition)
|
||||
partitionOpt.foreach { partition =>
|
||||
|
|
@ -169,12 +170,12 @@ class GroupMetadataManager(val brokerId: Int,
|
|||
def prepareStoreGroup(group: GroupMetadata,
|
||||
groupAssignment: Map[String, Array[Byte]],
|
||||
responseCallback: Short => Unit): DelayedStore = {
|
||||
val (magicValue, timestamp) = getMessageFormatVersionAndTimestamp(partitionFor(group.groupId))
|
||||
val message = new Message(
|
||||
key = GroupMetadataManager.groupMetadataKey(group.groupId),
|
||||
bytes = GroupMetadataManager.groupMetadataValue(group, groupAssignment),
|
||||
timestamp = time.milliseconds(),
|
||||
magicValue = getMessageFormatVersion(partitionFor(group.groupId))
|
||||
)
|
||||
timestamp = timestamp,
|
||||
magicValue = magicValue)
|
||||
|
||||
val groupMetadataPartition = new TopicPartition(GroupCoordinator.GroupMetadataTopicName, partitionFor(group.groupId))
|
||||
|
||||
|
|
@ -253,11 +254,12 @@ class GroupMetadataManager(val brokerId: Int,
|
|||
|
||||
// construct the message set to append
|
||||
val messages = filteredOffsetMetadata.map { case (topicAndPartition, offsetAndMetadata) =>
|
||||
val (magicValue, timestamp) = getMessageFormatVersionAndTimestamp(partitionFor(groupId))
|
||||
new Message(
|
||||
key = GroupMetadataManager.offsetCommitKey(groupId, topicAndPartition.topic, topicAndPartition.partition),
|
||||
bytes = GroupMetadataManager.offsetCommitValue(offsetAndMetadata),
|
||||
timestamp = time.milliseconds(),
|
||||
magicValue = getMessageFormatVersion(partitionFor(groupId))
|
||||
timestamp = timestamp,
|
||||
magicValue = magicValue
|
||||
)
|
||||
}.toSeq
|
||||
|
||||
|
|
@ -557,8 +559,8 @@ class GroupMetadataManager(val brokerId: Int,
|
|||
val commitKey = GroupMetadataManager.offsetCommitKey(groupTopicAndPartition.group,
|
||||
groupTopicAndPartition.topicPartition.topic, groupTopicAndPartition.topicPartition.partition)
|
||||
|
||||
(offsetsPartition, new Message(bytes = null, key = commitKey, timestamp = time.milliseconds(),
|
||||
magicValue = getMessageFormatVersion(offsetsPartition)))
|
||||
val (magicValue, timestamp) = getMessageFormatVersionAndTimestamp(offsetsPartition)
|
||||
(offsetsPartition, new Message(bytes = null, key = commitKey, timestamp = timestamp, magicValue = magicValue))
|
||||
}.groupBy { case (partition, tombstone) => partition }
|
||||
|
||||
// Append the tombstone messages to the offset partitions. It is okay if the replicas don't receive these (say,
|
||||
|
|
@ -627,11 +629,13 @@ class GroupMetadataManager(val brokerId: Int,
|
|||
config.offsetsTopicNumPartitions
|
||||
}
|
||||
|
||||
private def getMessageFormatVersion(partition: Int): Byte = {
|
||||
private def getMessageFormatVersionAndTimestamp(partition: Int): (Byte, Long) = {
|
||||
val groupMetadataTopicAndPartition = new TopicAndPartition(GroupCoordinator.GroupMetadataTopicName, partition)
|
||||
replicaManager.getMessageFormatVersion(groupMetadataTopicAndPartition).getOrElse {
|
||||
val messageFormatVersion = replicaManager.getMessageFormatVersion(groupMetadataTopicAndPartition).getOrElse {
|
||||
throw new IllegalArgumentException(s"Message format version for partition $groupMetadataTopicPartitionCount not found")
|
||||
}
|
||||
val timestamp = if (messageFormatVersion == Message.MagicValue_V0) Message.NoTimestamp else time.milliseconds()
|
||||
(messageFormatVersion, timestamp)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue