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]