mirror of https://github.com/apache/kafka.git
KAFKA-18432 Remove unused code from AutoTopicCreationManager (#18438)
Reviewers: Chia-Ping Tsai <chia7712@gmail.com>
This commit is contained in:
parent
4b1b67e3c4
commit
5efaae65c6
|
@ -18,9 +18,7 @@
|
||||||
package kafka.server
|
package kafka.server
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
|
||||||
import java.util.{Collections, Properties}
|
import java.util.{Collections, Properties}
|
||||||
import kafka.controller.KafkaController
|
|
||||||
import kafka.coordinator.transaction.TransactionCoordinator
|
import kafka.coordinator.transaction.TransactionCoordinator
|
||||||
import kafka.utils.Logging
|
import kafka.utils.Logging
|
||||||
import org.apache.kafka.clients.ClientResponse
|
import org.apache.kafka.clients.ClientResponse
|
||||||
|
@ -31,7 +29,7 @@ import org.apache.kafka.common.message.CreateTopicsRequestData
|
||||||
import org.apache.kafka.common.message.CreateTopicsRequestData.{CreatableTopic, CreatableTopicConfig, CreatableTopicConfigCollection}
|
import org.apache.kafka.common.message.CreateTopicsRequestData.{CreatableTopic, CreatableTopicConfig, CreatableTopicConfigCollection}
|
||||||
import org.apache.kafka.common.message.MetadataResponseData.MetadataResponseTopic
|
import org.apache.kafka.common.message.MetadataResponseData.MetadataResponseTopic
|
||||||
import org.apache.kafka.common.protocol.{ApiKeys, Errors}
|
import org.apache.kafka.common.protocol.{ApiKeys, Errors}
|
||||||
import org.apache.kafka.common.requests.{ApiError, CreateTopicsRequest, RequestContext, RequestHeader}
|
import org.apache.kafka.common.requests.{CreateTopicsRequest, RequestContext, RequestHeader}
|
||||||
import org.apache.kafka.coordinator.group.GroupCoordinator
|
import org.apache.kafka.coordinator.group.GroupCoordinator
|
||||||
import org.apache.kafka.coordinator.share.ShareCoordinator
|
import org.apache.kafka.coordinator.share.ShareCoordinator
|
||||||
import org.apache.kafka.server.common.{ControllerRequestCompletionHandler, NodeToControllerChannelManager}
|
import org.apache.kafka.server.common.{ControllerRequestCompletionHandler, NodeToControllerChannelManager}
|
||||||
|
@ -49,34 +47,13 @@ trait AutoTopicCreationManager {
|
||||||
): Seq[MetadataResponseTopic]
|
): Seq[MetadataResponseTopic]
|
||||||
}
|
}
|
||||||
|
|
||||||
object AutoTopicCreationManager {
|
|
||||||
|
|
||||||
def apply(
|
|
||||||
config: KafkaConfig,
|
|
||||||
channelManager: Option[NodeToControllerChannelManager],
|
|
||||||
adminManager: Option[ZkAdminManager],
|
|
||||||
controller: Option[KafkaController],
|
|
||||||
groupCoordinator: GroupCoordinator,
|
|
||||||
txnCoordinator: TransactionCoordinator,
|
|
||||||
shareCoordinator: Option[ShareCoordinator],
|
|
||||||
): AutoTopicCreationManager = {
|
|
||||||
new DefaultAutoTopicCreationManager(config, channelManager, adminManager,
|
|
||||||
controller, groupCoordinator, txnCoordinator, shareCoordinator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DefaultAutoTopicCreationManager(
|
class DefaultAutoTopicCreationManager(
|
||||||
config: KafkaConfig,
|
config: KafkaConfig,
|
||||||
channelManager: Option[NodeToControllerChannelManager],
|
channelManager: NodeToControllerChannelManager,
|
||||||
adminManager: Option[ZkAdminManager],
|
|
||||||
controller: Option[KafkaController],
|
|
||||||
groupCoordinator: GroupCoordinator,
|
groupCoordinator: GroupCoordinator,
|
||||||
txnCoordinator: TransactionCoordinator,
|
txnCoordinator: TransactionCoordinator,
|
||||||
shareCoordinator: Option[ShareCoordinator]
|
shareCoordinator: Option[ShareCoordinator]
|
||||||
) extends AutoTopicCreationManager with Logging {
|
) extends AutoTopicCreationManager with Logging {
|
||||||
if (controller.isEmpty && channelManager.isEmpty) {
|
|
||||||
throw new IllegalArgumentException("Must supply a channel manager if not supplying a controller")
|
|
||||||
}
|
|
||||||
|
|
||||||
private val inflightTopics = Collections.newSetFromMap(new ConcurrentHashMap[String, java.lang.Boolean]())
|
private val inflightTopics = Collections.newSetFromMap(new ConcurrentHashMap[String, java.lang.Boolean]())
|
||||||
|
|
||||||
|
@ -99,65 +76,13 @@ class DefaultAutoTopicCreationManager(
|
||||||
|
|
||||||
val creatableTopicResponses = if (creatableTopics.isEmpty) {
|
val creatableTopicResponses = if (creatableTopics.isEmpty) {
|
||||||
Seq.empty
|
Seq.empty
|
||||||
} else if (controller.isEmpty || !controller.get.isActive && channelManager.isDefined) {
|
|
||||||
sendCreateTopicRequest(creatableTopics, metadataRequestContext)
|
|
||||||
} else {
|
} else {
|
||||||
createTopicsInZk(creatableTopics, controllerMutationQuota)
|
sendCreateTopicRequest(creatableTopics, metadataRequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
uncreatableTopicResponses ++ creatableTopicResponses
|
uncreatableTopicResponses ++ creatableTopicResponses
|
||||||
}
|
}
|
||||||
|
|
||||||
private def createTopicsInZk(
|
|
||||||
creatableTopics: Map[String, CreatableTopic],
|
|
||||||
controllerMutationQuota: ControllerMutationQuota
|
|
||||||
): Seq[MetadataResponseTopic] = {
|
|
||||||
val topicErrors = new AtomicReference[Map[String, ApiError]]()
|
|
||||||
try {
|
|
||||||
// Note that we use timeout = 0 since we do not need to wait for metadata propagation
|
|
||||||
// and we want to get the response error immediately.
|
|
||||||
adminManager.get.createTopics(
|
|
||||||
timeout = 0,
|
|
||||||
validateOnly = false,
|
|
||||||
creatableTopics,
|
|
||||||
Map.empty,
|
|
||||||
controllerMutationQuota,
|
|
||||||
topicErrors.set
|
|
||||||
)
|
|
||||||
|
|
||||||
val creatableTopicResponses = Option(topicErrors.get) match {
|
|
||||||
case Some(errors) =>
|
|
||||||
errors.toSeq.map { case (topic, apiError) =>
|
|
||||||
val error = apiError.error match {
|
|
||||||
case Errors.TOPIC_ALREADY_EXISTS | Errors.REQUEST_TIMED_OUT =>
|
|
||||||
// The timeout error is expected because we set timeout=0. This
|
|
||||||
// nevertheless indicates that the topic metadata was created
|
|
||||||
// successfully, so we return LEADER_NOT_AVAILABLE.
|
|
||||||
Errors.LEADER_NOT_AVAILABLE
|
|
||||||
case error => error
|
|
||||||
}
|
|
||||||
|
|
||||||
new MetadataResponseTopic()
|
|
||||||
.setErrorCode(error.code)
|
|
||||||
.setName(topic)
|
|
||||||
.setIsInternal(Topic.isInternal(topic))
|
|
||||||
}
|
|
||||||
|
|
||||||
case None =>
|
|
||||||
creatableTopics.keySet.toSeq.map { topic =>
|
|
||||||
new MetadataResponseTopic()
|
|
||||||
.setErrorCode(Errors.UNKNOWN_TOPIC_OR_PARTITION.code)
|
|
||||||
.setName(topic)
|
|
||||||
.setIsInternal(Topic.isInternal(topic))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
creatableTopicResponses
|
|
||||||
} finally {
|
|
||||||
clearInflightRequests(creatableTopics)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def sendCreateTopicRequest(
|
private def sendCreateTopicRequest(
|
||||||
creatableTopics: Map[String, CreatableTopic],
|
creatableTopics: Map[String, CreatableTopic],
|
||||||
metadataRequestContext: Option[RequestContext]
|
metadataRequestContext: Option[RequestContext]
|
||||||
|
@ -189,10 +114,6 @@ class DefaultAutoTopicCreationManager(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val channelManager = this.channelManager.getOrElse {
|
|
||||||
throw new IllegalStateException("Channel manager must be defined in order to send CreateTopic requests.")
|
|
||||||
}
|
|
||||||
|
|
||||||
val request = metadataRequestContext.map { context =>
|
val request = metadataRequestContext.map { context =>
|
||||||
val requestVersion =
|
val requestVersion =
|
||||||
channelManager.controllerApiVersions.toScala match {
|
channelManager.controllerApiVersions.toScala match {
|
||||||
|
|
|
@ -385,8 +385,8 @@ class BrokerServer(
|
||||||
producerIdManagerSupplier, metrics, metadataCache, Time.SYSTEM)
|
producerIdManagerSupplier, metrics, metadataCache, Time.SYSTEM)
|
||||||
|
|
||||||
autoTopicCreationManager = new DefaultAutoTopicCreationManager(
|
autoTopicCreationManager = new DefaultAutoTopicCreationManager(
|
||||||
config, Some(clientToControllerChannelManager), None, None,
|
config, clientToControllerChannelManager, groupCoordinator,
|
||||||
groupCoordinator, transactionCoordinator, shareCoordinator)
|
transactionCoordinator, shareCoordinator)
|
||||||
|
|
||||||
dynamicConfigHandlers = Map[String, ConfigHandler](
|
dynamicConfigHandlers = Map[String, ConfigHandler](
|
||||||
ConfigType.TOPIC -> new TopicConfigHandler(replicaManager, config, quotaManagers, None),
|
ConfigType.TOPIC -> new TopicConfigHandler(replicaManager, config, quotaManagers, None),
|
||||||
|
|
Loading…
Reference in New Issue