This is an automated email from the ASF dual-hosted git repository.

KKcorps pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 3be62366ef5 Add TABLE_TENANT_INFO controller gauge for table-to-tenant 
mapping (#18823)
3be62366ef5 is described below

commit 3be62366ef5802e4e093b4638f359078dd391d09
Author: Arunkumar Saravanan <[email protected]>
AuthorDate: Fri Jun 26 18:32:45 2026 +0530

    Add TABLE_TENANT_INFO controller gauge for table-to-tenant mapping (#18823)
---
 .../configs/controller.yml                         |  14 ++
 .../pinot/common/metrics/ControllerGauge.java      |  11 ++
 .../controller/helix/SegmentStatusChecker.java     |  66 ++++++++
 .../controller/helix/SegmentStatusCheckerTest.java | 178 +++++++++++++++++++++
 4 files changed, 269 insertions(+)

diff --git 
a/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml 
b/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
index 576db59cb71..23e9c5b0c49 100644
--- a/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
+++ b/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
@@ -1,4 +1,18 @@
 rules:
+# tableTenantInfo: emitted by SegmentStatusChecker as
+#   
pinot.controller.tableTenantInfo.<tableNameWithType>.<tenantType>.<tenantName>
+# tenantType is one of: server, broker, tier.
+# MUST appear before the generic tableNameWithType rules — the extra path 
segments would otherwise be consumed
+# by those patterns and the tenantType/tenant labels would not be extracted.
+- pattern: 
"\"org\\.apache\\.pinot\\.common\\.metrics\"<type=\"ControllerMetrics\", 
name=\"pinot\\.controller\\.tableTenantInfo\\.(([^.]+)\\.)?([^.]*)_(OFFLINE|REALTIME)\\.([^.]+)\\.([^\"]+)\"><>(\\w+)"
+  name: "pinot_controller_tableTenantInfo_$7"
+  cache: true
+  labels:
+    database: "$2"
+    table: "$1$3"
+    tableType: "$4"
+    tenantType: "$5"
+    tenant: "$6"
 # Gauges that accept tableNameWithType
 - pattern: "\"?org\\.apache\\.pinot\\.common\\.metrics\"?<type=\"?\\w+\"?, 
name=\"?pinot\\.(\\w+)\\.(\\w+)\\.((\\w+)\\.)?(\\w+)_(OFFLINE|REALTIME)\\\"?><>(\\w+)"
   name: "pinot_$1_$2_$7"
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
index 58354a72f35..3660d3524e2 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
@@ -225,6 +225,17 @@ public enum ControllerGauge implements 
AbstractMetrics.Gauge {
 
   // The progress of a certain table rebalance job of a table
   TABLE_REBALANCE_JOB_PROGRESS_PERCENT("percent", false),
+
+  // Mapping metric for table-to-tenant attribution. One gauge per 
(tenantType, tenantName) pair; always set to 1.
+  // The compound key "<tenantType>.<tenantName>" is embedded as extra 
segments in the JMX metric name so that
+  // Prometheus can extract both as labels and join them onto other 
table-scoped metrics via group_left.
+  // tenantType values: "server" (server tenant), "broker" (broker tenant), 
"tier" (tier server tenant).
+  // JMX name pattern: 
pinot.controller.tableTenantInfo.<tableNameWithType>.<tenantType>.<tenantName>
+  // NOTE: this gauge is exempt from the standard ControllerGauge.values() 
loop in removeMetricsForTable because its
+  // registered name includes extra key segments. Removal is handled 
explicitly via _tableTenantMap in
+  // SegmentStatusChecker.
+  TABLE_TENANT_INFO("info", false),
+
   // HTTP thread utilization
   HTTP_THREAD_UTILIZATION("httpThreadUtilization", true),
   // Track the concurrent executions of the API resources that use 
@ManagedAsync
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
index d65504d377b..2d06ea9d976 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
@@ -43,6 +43,7 @@ import org.apache.pinot.common.metrics.ControllerGauge;
 import org.apache.pinot.common.metrics.ControllerMeter;
 import org.apache.pinot.common.metrics.ControllerMetrics;
 import org.apache.pinot.common.metrics.ControllerTimer;
+import org.apache.pinot.common.utils.config.TagNameUtils;
 import org.apache.pinot.controller.ControllerConf;
 import org.apache.pinot.controller.LeadControllerManager;
 import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
@@ -54,6 +55,7 @@ import 
org.apache.pinot.controller.util.ServerQueryInfoFetcher.ServerQueryInfo;
 import org.apache.pinot.controller.util.TableSizeReader;
 import org.apache.pinot.spi.config.table.TableConfig;
 import org.apache.pinot.spi.config.table.TableType;
+import org.apache.pinot.spi.config.table.TenantConfig;
 import org.apache.pinot.spi.config.table.TierConfig;
 import org.apache.pinot.spi.stream.StreamConfig;
 import 
org.apache.pinot.spi.utils.CommonConstants.Helix.StateModel.SegmentStateModel;
@@ -81,6 +83,10 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
   private final int _waitForPushTimeSeconds;
   private final TableSizeReader _tableSizeReader;
   private final Set<String> _tierBackendGauges = new HashSet<>();
+  // Maps tableNameWithType -> set of compound tenant keys 
("server.tenantName", "broker.tenantName",
+  // "tier.tenantName"), so stale gauges can be removed when a table's tenant 
assignment changes.
+  // Accessed only from the single-threaded periodic task execution loop 
(processTable / removeMetricsForTable).
+  private final Map<String, Set<String>> _tableTenantMap = new HashMap<>();
 
   private long _lastDisabledTableLogTimestamp = 0;
 
@@ -170,6 +176,12 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
     if (tableConfig == null) {
       LOGGER.warn("Found null table config for table: {}. Resetting table 
config metrics.", tableNameWithType);
       _controllerMetrics.setValueOfTableGauge(tableNameWithType, 
ControllerGauge.REPLICATION_FROM_CONFIG, 0);
+      Set<String> tenantKeys = _tableTenantMap.remove(tableNameWithType);
+      if (tenantKeys != null) {
+        for (String key : tenantKeys) {
+          _controllerMetrics.removeTableGauge(tableNameWithType, key, 
ControllerGauge.TABLE_TENANT_INFO);
+        }
+      }
       return;
     }
     if (tableConfig.getTableType() == TableType.OFFLINE) {
@@ -194,6 +206,54 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
     }
     int replication = tableConfig.getReplication();
     _controllerMetrics.setValueOfTableGauge(tableNameWithType, 
ControllerGauge.REPLICATION_FROM_CONFIG, replication);
+
+    updateTenantInfoGauge(tableNameWithType, tableConfig);
+  }
+
+  /**
+   * Emits one {@code tableTenantInfo} gauge per (tenantType, tenantName) pair 
for a table so Prometheus can extract
+   * both as labels and join them onto other table-scoped metrics.  Every 
gauge is always set to {@code 1}.
+   * TenantType values: {@code "server"} (server tenant), {@code "broker"} 
(broker tenant), {@code "tier"} (tier
+   * server tenant).  The compound key {@code "<tenantType>.<tenantName>"} is 
embedded in the JMX metric name.
+   * Gauges are only written on first registration or when the tenant 
assignment changes, not on every periodic cycle.
+   * When assignments change, new gauges are registered before stale ones are 
removed to avoid a scrape-window gap.
+   */
+  private void updateTenantInfoGauge(String tableNameWithType, TableConfig 
tableConfig) {
+    TenantConfig tenantConfig = tableConfig.getTenantConfig();
+
+    Set<String> newKeys = new HashSet<>();
+    String serverTenant = (tenantConfig != null && tenantConfig.getServer() != 
null)
+        ? tenantConfig.getServer() : TagNameUtils.DEFAULT_TENANT_NAME;
+    newKeys.add("server." + serverTenant);
+
+    String brokerTenant = (tenantConfig != null && tenantConfig.getBroker() != 
null)
+        ? tenantConfig.getBroker() : TagNameUtils.DEFAULT_TENANT_NAME;
+    newKeys.add("broker." + brokerTenant);
+
+    List<TierConfig> tierConfigs = tableConfig.getTierConfigsList();
+    if (tierConfigs != null) {
+      for (TierConfig tierConfig : tierConfigs) {
+        String serverTag = tierConfig.getServerTag();
+        if (serverTag != null && serverTag.contains("_")) {
+          newKeys.add("tier." + TagNameUtils.getTenantFromTag(serverTag));
+        }
+      }
+    }
+
+    Set<String> previousKeys = _tableTenantMap.put(tableNameWithType, newKeys);
+    if (newKeys.equals(previousKeys)) {
+      return;
+    }
+    for (String key : newKeys) {
+      _controllerMetrics.setOrUpdateTableGauge(tableNameWithType, key, 
ControllerGauge.TABLE_TENANT_INFO, 1L);
+    }
+    if (previousKeys != null) {
+      for (String key : previousKeys) {
+        if (!newKeys.contains(key)) {
+          _controllerMetrics.removeTableGauge(tableNameWithType, key, 
ControllerGauge.TABLE_TENANT_INFO);
+        }
+      }
+    }
   }
 
   private void updateTableSizeMetrics(String tableNameWithType)
@@ -500,6 +560,12 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
 
   private void removeMetricsForTable(String tableNameWithType) {
     LOGGER.info("Removing metrics from {} given it is not a table known by 
Helix", tableNameWithType);
+    Set<String> tenantKeys = _tableTenantMap.remove(tableNameWithType);
+    if (tenantKeys != null) {
+      for (String key : tenantKeys) {
+        _controllerMetrics.removeTableGauge(tableNameWithType, key, 
ControllerGauge.TABLE_TENANT_INFO);
+      }
+    }
     for (ControllerGauge metric : ControllerGauge.values()) {
       if (!metric.isGlobal()) {
         _controllerMetrics.removeTableGauge(tableNameWithType, metric);
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
index f2a949051e0..0066e482c28 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
@@ -39,6 +39,7 @@ import 
org.apache.pinot.common.metadata.segment.SegmentZKMetadata;
 import org.apache.pinot.common.metrics.ControllerGauge;
 import org.apache.pinot.common.metrics.ControllerMetrics;
 import org.apache.pinot.common.metrics.MetricValueUtils;
+import org.apache.pinot.common.tier.TierFactory;
 import org.apache.pinot.common.utils.LLCSegmentName;
 import org.apache.pinot.controller.ControllerConf;
 import org.apache.pinot.controller.LeadControllerManager;
@@ -48,6 +49,7 @@ import 
org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
 import org.apache.pinot.controller.util.TableSizeReader;
 import org.apache.pinot.spi.config.table.TableConfig;
 import org.apache.pinot.spi.config.table.TableType;
+import org.apache.pinot.spi.config.table.TierConfig;
 import org.apache.pinot.spi.metrics.PinotMetricUtils;
 import org.apache.pinot.spi.utils.CommonConstants;
 import org.apache.pinot.spi.utils.CommonConstants.Segment.Realtime.Status;
@@ -976,4 +978,180 @@ public class SegmentStatusCheckerTest {
     assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
         ControllerGauge.SEGMENTS_WITH_INVALID_END_TIME), 1);
   }
+
+  @Test
+  public void tableTenantInfoGaugeNamedTenantTest() {
+    String serverTenant = "myTenant";
+    String brokerTenant = "myBroker";
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setServerTenant(serverTenant)
+            .setBrokerTenant(brokerTenant).build();
+
+    IdealState idealState = new IdealState(OFFLINE_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(OFFLINE_TABLE_NAME));
+    
when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(tableConfig);
+    
when(resourceManager.getTableIdealState(OFFLINE_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    runSegmentStatusChecker(resourceManager, 0);
+
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server." + serverTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "broker." + brokerTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+  }
+
+  @Test
+  public void tableTenantInfoGaugeDefaultTenantFallbackTest() {
+    // No tenant configured — both server and broker should fall back to 
"DefaultTenant".
+    TableConfig tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).build();
+
+    IdealState idealState = new IdealState(OFFLINE_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(OFFLINE_TABLE_NAME));
+    
when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(tableConfig);
+    
when(resourceManager.getTableIdealState(OFFLINE_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    runSegmentStatusChecker(resourceManager, 0);
+
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server.DefaultTenant", ControllerGauge.TABLE_TENANT_INFO), 1);
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "broker.DefaultTenant", ControllerGauge.TABLE_TENANT_INFO), 1);
+  }
+
+  @Test
+  public void tableTenantInfoGaugeTierTenantTest() {
+    // Table with a tier config — tier server tenant should be extracted from 
the server tag and emitted.
+    TierConfig tierConfig = new TierConfig("coldTier", 
TierFactory.TIME_SEGMENT_SELECTOR_TYPE, "30d", null,
+        TierFactory.PINOT_SERVER_STORAGE_TYPE, "tierTenant_OFFLINE", null, 
null);
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setServerTenant("myTenant")
+            .setTierConfigList(List.of(tierConfig)).build();
+
+    IdealState idealState = new IdealState(OFFLINE_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(OFFLINE_TABLE_NAME));
+    
when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(tableConfig);
+    
when(resourceManager.getTableIdealState(OFFLINE_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    runSegmentStatusChecker(resourceManager, 0);
+
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server.myTenant", ControllerGauge.TABLE_TENANT_INFO), 1);
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "tier.tierTenant", ControllerGauge.TABLE_TENANT_INFO), 1);
+  }
+
+  @Test
+  public void tableTenantInfoGaugeTenantChangeCleansStaleGaugeTest() {
+    String firstTenant = "tenantA";
+    String secondTenant = "tenantB";
+
+    IdealState idealState = new IdealState(OFFLINE_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(OFFLINE_TABLE_NAME));
+    
when(resourceManager.getTableIdealState(OFFLINE_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    // First run: table on firstTenant.
+    when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setServerTenant(firstTenant).build());
+    SegmentStatusChecker checker = buildSegmentStatusChecker(resourceManager, 
0);
+    checker.start();
+    checker.run();
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server." + firstTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+
+    // Second run: table moves to secondTenant — stale gauge for firstTenant 
must be removed.
+    when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setServerTenant(secondTenant).build());
+    checker.run();
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server." + secondTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+    assertFalse(MetricValueUtils.tableGaugeExists(_controllerMetrics, 
OFFLINE_TABLE_NAME, "server." + firstTenant,
+        ControllerGauge.TABLE_TENANT_INFO), "stale server firstTenant gauge 
must be removed after tenant change");
+  }
+
+  @Test
+  public void tableTenantInfoGaugeTableRemovedCleansUpTest() {
+    String serverTenant = "myTenant";
+
+    IdealState idealState = new IdealState(OFFLINE_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(OFFLINE_TABLE_NAME));
+    when(resourceManager.getTableConfig(OFFLINE_TABLE_NAME)).thenReturn(
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setServerTenant(serverTenant).build());
+    
when(resourceManager.getTableIdealState(OFFLINE_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    SegmentStatusChecker checker = buildSegmentStatusChecker(resourceManager, 
0);
+    checker.start();
+    checker.run();
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
OFFLINE_TABLE_NAME,
+        "server." + serverTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+
+    // Table disappears from Helix — nonLeaderCleanup triggers 
removeMetricsForTable.
+    checker.nonLeaderCleanup(List.of(OFFLINE_TABLE_NAME));
+    assertFalse(MetricValueUtils.tableGaugeExists(_controllerMetrics, 
OFFLINE_TABLE_NAME, "server." + serverTenant,
+        ControllerGauge.TABLE_TENANT_INFO), "tenant gauge must be removed when 
table is cleaned up");
+  }
+
+  @Test
+  public void tableTenantInfoGaugeRealtimeTableTest() {
+    String serverTenant = "realtimeTenant";
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.REALTIME).setTableName(RAW_TABLE_NAME).setServerTenant(serverTenant)
+            
.setTimeColumnName("timeColumn").setStreamConfigs(getStreamConfigMap()).build();
+
+    IdealState idealState = new IdealState(REALTIME_TABLE_NAME);
+    idealState.setReplicas("1");
+    idealState.setRebalanceMode(IdealState.RebalanceMode.CUSTOMIZED);
+
+    PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+    
when(resourceManager.getAllTables()).thenReturn(List.of(REALTIME_TABLE_NAME));
+    
when(resourceManager.getTableConfig(REALTIME_TABLE_NAME)).thenReturn(tableConfig);
+    
when(resourceManager.getTableIdealState(REALTIME_TABLE_NAME)).thenReturn(idealState);
+    ZkHelixPropertyStore<ZNRecord> propertyStore = 
mock(ZkHelixPropertyStore.class);
+    when(resourceManager.getPropertyStore()).thenReturn(propertyStore);
+
+    runSegmentStatusChecker(resourceManager, 0);
+
+    assertEquals(MetricValueUtils.getTableGaugeValue(_controllerMetrics, 
REALTIME_TABLE_NAME,
+        "server." + serverTenant, ControllerGauge.TABLE_TENANT_INFO), 1);
+  }
+
+  private SegmentStatusChecker 
buildSegmentStatusChecker(PinotHelixResourceManager resourceManager,
+      int waitForPushTimeInSeconds) {
+    LeadControllerManager leadControllerManager = 
mock(LeadControllerManager.class);
+    when(leadControllerManager.isLeaderForTable(anyString())).thenReturn(true);
+    ControllerConf controllerConf = mock(ControllerConf.class);
+    
when(controllerConf.getStatusCheckerWaitForPushTimeInSeconds()).thenReturn(waitForPushTimeInSeconds);
+    TableSizeReader tableSizeReader = mock(TableSizeReader.class);
+    return new SegmentStatusChecker(resourceManager, leadControllerManager, 
controllerConf, _controllerMetrics,
+        tableSizeReader);
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to