Class CpcClusterMetadata
java.lang.Object
io.confluent.kafka.multitenant.BasePhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>
io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>
io.confluent.kafka.cpc.multitenant.CpcClusterMetadata
- All Implemented Interfaces:
org.apache.kafka.common.Configurable, org.apache.kafka.common.Reconfigurable, org.apache.kafka.server.multitenant.MultiTenantMetadata
public class CpcClusterMetadata
extends io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>
Broker-side tenant metadata store for CPC multi-tenancy. Consumes JSON-encoded
CpcLogicalClusterMetadata records from a compacted internal topic and maintains
an in-memory cache of tenant metadata.
Extends CommonTopicBasedPhysicalClusterMetadata to share the common consume loop,
sequence-id dedup (via io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>.io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata.LCMPair), and state machine with the Cloud implementation.
CPC does not register or emit any metrics. CPC-specific behavior: JSON parsing
(vs. protobuf), TopicAdmin-based
auto-creation of the metadata topic, tenant lifecycle management via
CpcTenantLifecycleManager, and callback-based tenant event notification.
There are two distinct phases of processing:
- Startup (STARTING): The entire topic is read to end via
KafkaBasedLog.start(). Each record is stored in the cache, butupdateTenant(CpcLogicalClusterMetadata, CpcLogicalClusterMetadata)is not called (no callbacks fire per-record). After the initial load, a single batch of bookkeeping runs: rebuild active IDs, invoke register callbacks for all active tenants, then set state to RUNNING. - Running (RUNNING): New records from the topic are consumed one at a time by the
KafkaBasedLog WorkThread. Each record triggers
updateTenant(CpcLogicalClusterMetadata, CpcLogicalClusterMetadata), which fires the appropriate callback (register, update, or deactivated) and rebuilds active IDs.
-
Nested Class Summary
Nested classes/interfaces inherited from class io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata
io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata.State -
Field Summary
Fields inherited from class io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata
NUMBER_OF_NON_HC_TENANTS_METRIC_NAME, NUMBER_OF_TENANTS_METRIC_NAMEFields inherited from interface org.apache.kafka.server.multitenant.MultiTenantMetadata
CONFLUENT_ENV_ID -
Constructor Summary
ConstructorsConstructorDescriptionCpcClusterMetadata(org.apache.kafka.common.metrics.Metrics metrics) CpcClusterMetadata(org.apache.kafka.common.metrics.Metrics metrics, org.apache.kafka.common.utils.Time time) -
Method Summary
Modifier and TypeMethodDescriptionvoidvoidConsume a single metadata record, then refresh tenant quotas.booleanisUp()voidregisterTenantCallback(Function<String, Boolean> callback) voidregisterTenantDeactivatedCallback(Function<String, Boolean> callback) voidMap<org.apache.kafka.common.Endpoint, CompletableFuture<Void>> start(Map<String, Object> interBrokerClientConfig, Collection<org.apache.kafka.common.Endpoint> endpoints) voidstartClients(Function<String, org.apache.kafka.clients.admin.Admin> adminClientSupplier) Methods inherited from class io.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata
close, logicalClusterIdsIncludingStale, metadata, startMethods inherited from class io.confluent.kafka.multitenant.BasePhysicalClusterMetadata
getInstance, getTenantMetadataForDedicatedCluster, reconfigurableConfigs, reconfigure, validateReconfigurationMethods inherited from class Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.apache.kafka.server.multitenant.MultiTenantMetadata
ensureOpen, firstActiveUserLkcMetadata
-
Constructor Details
-
CpcClusterMetadata
public CpcClusterMetadata(org.apache.kafka.common.metrics.Metrics metrics) -
CpcClusterMetadata
public CpcClusterMetadata(org.apache.kafka.common.metrics.Metrics metrics, org.apache.kafka.common.utils.Time time)
-
-
Method Details
-
configure
-
start
public Map<org.apache.kafka.common.Endpoint, CompletableFuture<Void>> start(Map<String, Object> interBrokerClientConfig, Collection<org.apache.kafka.common.Endpoint> endpoints) -
startClients
-
isUp
public boolean isUp() -
logicalClusterIds
- Specified by:
logicalClusterIdsin interfaceorg.apache.kafka.server.multitenant.MultiTenantMetadata- Specified by:
logicalClusterIdsin classio.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>
-
kafkaLogicalClusterIds
-
dedicatedLogicalClusterId
-
registerTenantCallback
-
registerTenantMetadataUpdateCallback
-
registerTenantDeactivatedCallback
-
consume
Consume a single metadata record, then refresh tenant quotas. This is the single choke point for quota refresh in the RUNNING phase: it covers every mutation kind — register, update, deactivate (all viaupdateLogicalCluster(String, Long, CpcLogicalClusterMetadata)) and topic tombstone (via the parent's removeLogicalCluster) — because they all flow throughconsume(). During the STARTING load, per-record refresh is intentionally skipped;startLog()pushes the initial active set once after the full load.- Overrides:
consumein classio.confluent.kafka.multitenant.CommonTopicBasedPhysicalClusterMetadata<io.confluent.kafka.cpc.multitenant.CpcLogicalClusterMetadata>
-