Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ private[group] class DelayedHeartbeat(coordinator: GroupCoordinator,
extends DelayedOperation(timeoutMs, Some(group.lock)) {

override def tryComplete(): Boolean = coordinator.tryCompleteHeartbeat(group, memberId, isPending, forceComplete _)
override def onExpiration() = coordinator.onExpireHeartbeat(group, memberId, isPending)
override def onComplete() = coordinator.onCompleteHeartbeat()
override def onExpiration(): Unit = coordinator.onExpireHeartbeat(group, memberId, isPending)
override def onComplete(): Unit = {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ private[group] class DelayedJoin(coordinator: GroupCoordinator,

override def tryComplete(): Boolean = coordinator.tryCompleteJoin(group, forceComplete _)
override def onExpiration(): Unit = {
coordinator.onExpireJoin()
// try to complete delayed actions introduced by coordinator.onCompleteJoin
tryToCompleteDelayedAction()
}
Expand Down
23 changes: 5 additions & 18 deletions core/src/main/scala/kafka/coordinator/group/GroupCoordinator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ class GroupCoordinator(val brokerId: Int,
group.inLock {
if (!acceptJoiningMember(group, memberId)) {
group.remove(memberId)
group.removeStaticMember(groupInstanceId)
responseCallback(JoinGroupResult(JoinGroupRequest.UNKNOWN_MEMBER_ID, Errors.GROUP_MAX_SIZE_REACHED))
} else if (isUnknownMember) {
doUnknownJoinGroup(group, groupInstanceId, requireKnownMemberId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs, protocolType, protocols, responseCallback)
Expand Down Expand Up @@ -884,7 +883,7 @@ class GroupCoordinator(val brokerId: Int,
case Stable | CompletingRebalance =>
for (member <- group.allMemberMetadata) {
group.maybeInvokeSyncCallback(member, SyncGroupResult(Errors.NOT_COORDINATOR))
heartbeatPurgatory.checkAndComplete(MemberKey(member.groupId, member.memberId))
heartbeatPurgatory.checkAndComplete(MemberKey(group.groupId, member.memberId))
}
}
}
Expand Down Expand Up @@ -962,7 +961,7 @@ class GroupCoordinator(val brokerId: Int,
}

private def completeAndScheduleNextExpiration(group: GroupMetadata, member: MemberMetadata, timeoutMs: Long): Unit = {
val memberKey = MemberKey(member.groupId, member.memberId)
val memberKey = MemberKey(group.groupId, member.memberId)

// complete current heartbeat expectation
member.heartbeatSatisfied = true
Expand All @@ -985,7 +984,7 @@ class GroupCoordinator(val brokerId: Int,

private def removeHeartbeatForLeavingMember(group: GroupMetadata, member: MemberMetadata): Unit = {
member.isLeaving = true
val memberKey = MemberKey(member.groupId, member.memberId)
val memberKey = MemberKey(group.groupId, member.memberId)
heartbeatPurgatory.checkAndComplete(memberKey)
}

Expand All @@ -999,9 +998,8 @@ class GroupCoordinator(val brokerId: Int,
protocols: List[(String, Array[Byte])],
group: GroupMetadata,
callback: JoinCallback): Unit = {
val member = new MemberMetadata(memberId, group.groupId, groupInstanceId,
clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, protocols)
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost,
rebalanceTimeoutMs, sessionTimeoutMs, protocolType, protocols)

member.isNew = true

Expand Down Expand Up @@ -1151,9 +1149,7 @@ class GroupCoordinator(val brokerId: Int,
// to invoke the callback before removing the member. We return UNKNOWN_MEMBER_ID so that the consumer
// will retry the JoinGroup request if is still active.
group.maybeInvokeJoinCallback(member, JoinGroupResult(JoinGroupRequest.UNKNOWN_MEMBER_ID, Errors.UNKNOWN_MEMBER_ID))

group.remove(member.memberId)
group.removeStaticMember(member.groupInstanceId)

group.currentState match {
case Dead | Empty =>
Expand All @@ -1178,10 +1174,6 @@ class GroupCoordinator(val brokerId: Int,
}
}

def onExpireJoin(): Unit = {
// TODO: add metrics for restabilize timeouts
}

def onCompleteJoin(group: GroupMetadata): Unit = {
group.inLock {
val notYetRejoinedDynamicMembers = group.notYetRejoinedMembers.filterNot(_._2.isStaticMember)
Expand All @@ -1192,7 +1184,6 @@ class GroupCoordinator(val brokerId: Int,
notYetRejoinedDynamicMembers.values foreach { failedMember =>
removeHeartbeatForLeavingMember(group, failedMember)
group.remove(failedMember.memberId)
// TODO: cut the socket connection to the client
}
}

Expand Down Expand Up @@ -1296,10 +1287,6 @@ class GroupCoordinator(val brokerId: Int,
}
}

def onCompleteHeartbeat(): Unit = {
// TODO: add metrics for complete heartbeats
}

def partitionFor(group: String): Int = groupManager.partitionFor(group)

private def groupIsOverCapacity(group: GroupMetadata): Boolean = {
Expand Down
16 changes: 5 additions & 11 deletions core/src/main/scala/kafka/coordinator/group/GroupMetadata.scala
Original file line number Diff line number Diff line change
Expand Up @@ -141,14 +141,13 @@ private object GroupMetadata extends Logging {
group.protocolName = Option(protocolName)
group.leaderId = Option(leaderId)
group.currentStateTimestamp = currentStateTimestamp
members.foreach(member => {
members.foreach { member =>
group.add(member, null)
if (member.isStaticMember) {
info(s"Static member $member.groupInstanceId of group $groupId loaded " +
s"with member id ${member.memberId} at generation ${group.generationId}.")
group.addStaticMember(member.groupInstanceId, member.memberId)
}
})
info(s"Loaded member $member in group $groupId with generation ${group.generationId}.")
}
group.subscribedTopics = group.computeSubscribedTopics()
group
}
Expand Down Expand Up @@ -243,7 +242,6 @@ private[group] class GroupMetadata(val groupId: String, initialState: GroupState
if (members.isEmpty)
this.protocolType = Some(member.protocolType)

assert(groupId == member.groupId)
assert(this.protocolType.orNull == member.protocolType)
assert(supportsProtocols(member.protocolType, MemberMetadata.plainProtocolSet(member.supportedProtocols)))

Expand All @@ -261,6 +259,8 @@ private[group] class GroupMetadata(val groupId: String, initialState: GroupState
member.supportedProtocols.foreach{ case (protocol, _) => supportedProtocols(protocol) -= 1 }
if (member.isAwaitingJoin)
numMembersAwaitingJoin -= 1

member.groupInstanceId.foreach(staticMembers.remove)
}

if (isLeader(memberId))
Expand Down Expand Up @@ -347,12 +347,6 @@ private[group] class GroupMetadata(val groupId: String, initialState: GroupState
staticMembers.put(groupInstanceId.get, newMemberId)
}

def removeStaticMember(groupInstanceId: Option[String]) = {
if (groupInstanceId.isDefined) {
staticMembers.remove(groupInstanceId.get)
}
}

def currentState = state

def notYetRejoinedMembers = members.filter(!_._2.isAwaitingJoin).toMap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1147,7 +1147,6 @@ object GroupMetadataManager {
val members = value.members.asScala.map { memberMetadata =>
new MemberMetadata(
memberId = memberMetadata.memberId,
groupId = groupId,
groupInstanceId = Option(memberMetadata.groupInstanceId),
clientId = memberMetadata.clientId,
clientHost = memberMetadata.clientHost,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ private object MemberMetadata {
*/
@nonthreadsafe
private[group] class MemberMetadata(var memberId: String,
val groupId: String,
val groupInstanceId: Option[String],
val clientId: String,
val clientHost: String,
Expand All @@ -68,7 +67,8 @@ private[group] class MemberMetadata(var memberId: String,
var awaitingSyncCallback: SyncGroupResult => Unit = null
var isLeaving: Boolean = false
var isNew: Boolean = false
val isStaticMember: Boolean = groupInstanceId.isDefined

def isStaticMember: Boolean = groupInstanceId.isDefined

// This variable is used to track heartbeat completion through the delayed
// heartbeat purgatory. When scheduling a new heartbeat expiration, we set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ class GroupCoordinatorTest {
val memberIds = 1.to(nbMembers).map(_ => group.generateMemberId(ClientId, None))

memberIds.foreach { memberId =>
group.add(new MemberMetadata(memberId, groupId, None, ClientId, ClientHost,
group.add(new MemberMetadata(memberId, None, ClientId, ClientHost,
DefaultRebalanceTimeout, GroupMaxSessionTimeout, protocolType, protocols))
}
groupCoordinator.groupManager.addGroup(group)
Expand Down Expand Up @@ -1736,7 +1736,7 @@ class GroupCoordinatorTest {
val memberId = "memberId"

val group = new GroupMetadata(groupId, Empty, new MockTime())
val member = new MemberMetadata(memberId, groupId, groupInstanceId,
val member = new MemberMetadata(memberId, groupInstanceId,
ClientId, ClientHost, DefaultRebalanceTimeout, DefaultSessionTimeout,
protocolType, List(("range", Array.empty[Byte]), ("roundrobin", Array.empty[Byte])))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -843,10 +843,10 @@ class GroupMetadataManagerTest {
val staticMemberId = "staticMemberId"
val dynamicMemberId = "dynamicMemberId"

val staticMember = new MemberMetadata(staticMemberId, groupId, groupInstanceId, "", "", rebalanceTimeout, sessionTimeout,
val staticMember = new MemberMetadata(staticMemberId, groupInstanceId, "", "", rebalanceTimeout, sessionTimeout,
protocolType, List(("protocol", Array[Byte]())))

val dynamicMember = new MemberMetadata(dynamicMemberId, groupId, None, "", "", rebalanceTimeout, sessionTimeout,
val dynamicMember = new MemberMetadata(dynamicMemberId, None, "", "", rebalanceTimeout, sessionTimeout,
protocolType, List(("protocol", Array[Byte]())))

val members = Seq(staticMember, dynamicMember)
Expand Down Expand Up @@ -874,7 +874,7 @@ class GroupMetadataManagerTest {
("protocol", ConsumerProtocol.serializeSubscription(new Subscription(List(topic).asJava)).array())
)

val member = new MemberMetadata(memberId, groupId, groupInstanceId, "", "", rebalanceTimeout,
val member = new MemberMetadata(memberId, groupInstanceId, "", "", rebalanceTimeout,
sessionTimeout, protocolType, subscriptions)

val members = Seq(member)
Expand Down Expand Up @@ -914,7 +914,7 @@ class GroupMetadataManagerTest {

val subscriptions = List(("protocol", Array[Byte]()))

val member = new MemberMetadata(memberId, groupId, groupInstanceId, "", "", rebalanceTimeout,
val member = new MemberMetadata(memberId, groupInstanceId, "", "", rebalanceTimeout,
sessionTimeout, protocolType, subscriptions)

val members = Seq(member)
Expand Down Expand Up @@ -1091,7 +1091,7 @@ class GroupMetadataManagerTest {
val group = new GroupMetadata(groupId, Empty, time)
groupMetadataManager.addGroup(group)

val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
protocolType, List(("protocol", Array[Byte]())))
group.add(member, _ => ())
group.transitionTo(PreparingRebalance)
Expand Down Expand Up @@ -1120,7 +1120,7 @@ class GroupMetadataManagerTest {

val group = new GroupMetadata(groupId, Empty, time)

val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
protocolType, List(("protocol", Array[Byte]())))
group.add(member, _ => ())
group.transitionTo(PreparingRebalance)
Expand Down Expand Up @@ -1619,7 +1619,7 @@ class GroupMetadataManagerTest {
groupMetadataManager.addGroup(group)

val subscription = new Subscription(List(topic).asJava)
val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeout, sessionTimeout,
protocolType, List(("protocol", ConsumerProtocol.serializeSubscription(subscription).array())))
group.add(member, _ => ())
group.transitionTo(PreparingRebalance)
Expand Down Expand Up @@ -1864,7 +1864,6 @@ class GroupMetadataManagerTest {

val member = new MemberMetadata(
memberId,
groupId,
groupInstanceId,
clientId,
clientHost,
Expand Down Expand Up @@ -2303,7 +2302,7 @@ class GroupMetadataManagerTest {
assignmentBytes: Array[Byte] = Array.emptyByteArray,
apiVersion: ApiVersion = ApiVersion.latestVersion): SimpleRecord = {
val memberProtocols = List((protocol, Array.emptyByteArray))
val member = new MemberMetadata(memberId, groupId, groupInstanceId, "clientId", "clientHost", 30000, 10000, protocolType, memberProtocols)
val member = new MemberMetadata(memberId, groupInstanceId, "clientId", "clientHost", 30000, 10000, protocolType, memberProtocols)
val group = GroupMetadata.loadGroup(groupId, Stable, generation, protocolType, protocol, memberId,
if (apiVersion >= KAFKA_2_1_IV0) Some(time.milliseconds()) else None, Seq(member), time)
val groupMetadataKey = GroupMetadataManager.groupMetadataKey(groupId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import scala.jdk.CollectionConverters._
*/
class GroupMetadataTest {
private val protocolType = "consumer"
private val groupId = "groupId"
private val groupInstanceId = Some("groupInstanceId")
private val memberId = "memberId"
private val clientId = "clientId"
Expand All @@ -47,7 +46,7 @@ class GroupMetadataTest {
@BeforeEach
def setUp(): Unit = {
group = new GroupMetadata("groupId", Empty, Time.SYSTEM)
member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
protocolType, List(("range", Array.empty[Byte]), ("roundrobin", Array.empty[Byte])))
}

Expand Down Expand Up @@ -195,22 +194,22 @@ class GroupMetadataTest {
@Test
def testSelectProtocol(): Unit = {
val memberId = "memberId"
val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
protocolType, List(("range", Array.empty[Byte]), ("roundrobin", Array.empty[Byte])))

group.add(member)
assertEquals("range", group.selectProtocol)

val otherMemberId = "otherMemberId"
val otherMember = new MemberMetadata(otherMemberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val otherMember = new MemberMetadata(otherMemberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("roundrobin", Array.empty[Byte]), ("range", Array.empty[Byte])))

group.add(otherMember)
// now could be either range or robin since there is no majority preference
assertTrue(Set("range", "roundrobin")(group.selectProtocol))

val lastMemberId = "lastMemberId"
val lastMember = new MemberMetadata(lastMemberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val lastMember = new MemberMetadata(lastMemberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("roundrobin", Array.empty[Byte]), ("range", Array.empty[Byte])))

group.add(lastMember)
Expand All @@ -226,11 +225,11 @@ class GroupMetadataTest {
@Test
def testSelectProtocolChoosesCompatibleProtocol(): Unit = {
val memberId = "memberId"
val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs, sessionTimeoutMs,
protocolType, List(("range", Array.empty[Byte]), ("roundrobin", Array.empty[Byte])))

val otherMemberId = "otherMemberId"
val otherMember = new MemberMetadata(otherMemberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val otherMember = new MemberMetadata(otherMemberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("roundrobin", Array.empty[Byte]), ("blah", Array.empty[Byte])))

group.add(member)
Expand All @@ -250,7 +249,7 @@ class GroupMetadataTest {
assertFalse(group.supportsProtocols(protocolType, Set("foo", "bar")))

val otherMemberId = "otherMemberId"
val otherMember = new MemberMetadata(otherMemberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val otherMember = new MemberMetadata(otherMemberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("roundrobin", Array.empty[Byte]), ("blah", Array.empty[Byte])))

group.add(otherMember)
Expand All @@ -266,7 +265,7 @@ class GroupMetadataTest {
assertEquals(None, group.getSubscribedTopics)

val memberId = "memberId"
val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("range", ConsumerProtocol.serializeSubscription(new Subscription(List("foo").asJava)).array())))

group.transitionTo(PreparingRebalance)
Expand All @@ -283,7 +282,7 @@ class GroupMetadataTest {

assertEquals(Some(Set.empty), group.getSubscribedTopics)

val memberWithFaultyProtocol = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val memberWithFaultyProtocol = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, protocolType, List(("range", Array.empty[Byte])))

group.transitionTo(PreparingRebalance)
Expand All @@ -300,7 +299,7 @@ class GroupMetadataTest {
assertEquals(None, group.getSubscribedTopics)

val memberId = "memberId"
val member = new MemberMetadata(memberId, groupId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
val member = new MemberMetadata(memberId, groupInstanceId, clientId, clientHost, rebalanceTimeoutMs,
sessionTimeoutMs, "My Protocol", List(("range", Array.empty[Byte])))

group.transitionTo(PreparingRebalance)
Expand Down
Loading