You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by jl...@apache.org on 2024/03/29 03:42:44 UTC
(pinot) 01/01: Emit table size related metrics only in lead controller
This is an automated email from the ASF dual-hosted git repository.
jlli pushed a commit to branch emit-table-size-metrics
in repository https://gitbox.apache.org/repos/asf/pinot.git
commit 3183940a2078e6de58642f2a2b9cd463f3d19f57
Author: jlli_LinkedIn <jl...@linkedin.com>
AuthorDate: Thu Mar 28 20:42:23 2024 -0700
Emit table size related metrics only in lead controller
---
.../controller/api/resources/DebugResource.java | 7 +++-
.../PinotSegmentUploadDownloadRestletResource.java | 2 +-
.../pinot/controller/api/resources/TableSize.java | 7 +++-
.../api/upload/SegmentValidationUtils.java | 6 ++--
.../controller/helix/SegmentStatusChecker.java | 2 +-
.../pinot/controller/util/TableSizeReader.java | 41 ++++++++++++----------
.../pinot/controller/api/TableSizeReaderTest.java | 11 ++++--
7 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
index 88d81f679f..e8dbd0d8a1 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
@@ -65,6 +65,7 @@ import org.apache.pinot.common.restlet.resources.SegmentErrorInfo;
import org.apache.pinot.common.restlet.resources.SegmentServerDebugInfo;
import org.apache.pinot.common.utils.DatabaseUtils;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.debug.TableDebugInfo;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
@@ -123,6 +124,9 @@ public class DebugResource {
@Inject
ControllerConf _controllerConf;
+ @Inject
+ LeadControllerManager _leadControllerManager;
+
@GET
@Path("tables/{tableName}")
@Authorize(targetType = TargetType.TABLE, paramName = "tableName", action = Actions.Table.GET_DEBUG_INFO)
@@ -238,7 +242,8 @@ public class DebugResource {
private TableDebugInfo.TableSizeSummary getTableSize(String tableNameWithType) {
TableSizeReader tableSizeReader =
- new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager);
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager,
+ _leadControllerManager);
TableSizeReader.TableSizeDetails tableSizeDetails;
try {
tableSizeDetails = tableSizeReader
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
index c92aef2cf3..04ff031674 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
@@ -363,7 +363,7 @@ public class PinotSegmentUploadDownloadRestletResource {
}
SegmentValidationUtils.checkStorageQuota(segmentName, untarredSegmentSizeInBytes, tableConfig,
_pinotHelixResourceManager, _controllerConf, _controllerMetrics, _connectionManager, _executor,
- _leadControllerManager.isLeaderForTable(tableNameWithType));
+ _leadControllerManager);
// Encrypt segment
String crypterNameInTableConfig = tableConfig.getValidationConfig().getCrypterClassName();
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
index dd8f7f78d3..22e95cc5f3 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
@@ -39,6 +39,7 @@ import javax.ws.rs.core.Response;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.controller.util.TableSizeReader;
@@ -70,6 +71,9 @@ public class TableSize {
@Inject
ControllerMetrics _controllerMetrics;
+ @Inject
+ LeadControllerManager _leadControllerManager;
+
@GET
@Path("/tables/{tableName}/size")
@Authorize(targetType = TargetType.TABLE, paramName = "tableName", action = Actions.Table.GET_SIZE)
@@ -84,7 +88,8 @@ public class TableSize {
@ApiParam(value = "Table name without type", required = true, example = "myTable | myTable_OFFLINE")
@PathParam("tableName") String tableName) {
TableSizeReader tableSizeReader =
- new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager);
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager,
+ _leadControllerManager);
TableSizeReader.TableSizeDetails tableSizeDetails = null;
try {
tableSizeDetails =
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
index f02718f1aa..18494b585e 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
@@ -23,6 +23,7 @@ import javax.ws.rs.core.Response;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.controller.util.TableSizeReader;
@@ -65,12 +66,13 @@ public class SegmentValidationUtils {
public static void checkStorageQuota(String segmentName, long segmentSizeInBytes, TableConfig tableConfig,
PinotHelixResourceManager resourceManager, ControllerConf controllerConf, ControllerMetrics controllerMetrics,
- HttpClientConnectionManager connectionManager, Executor executor, boolean isLeaderForTable) {
+ HttpClientConnectionManager connectionManager, Executor executor, LeadControllerManager leadControllerManager) {
if (!controllerConf.getEnableStorageQuotaCheck()) {
return;
}
+ boolean isLeaderForTable = leadControllerManager.isLeaderForTable(tableConfig.getTableName());
TableSizeReader tableSizeReader =
- new TableSizeReader(executor, connectionManager, controllerMetrics, resourceManager);
+ new TableSizeReader(executor, connectionManager, controllerMetrics, resourceManager, leadControllerManager);
StorageQuotaChecker quotaChecker =
new StorageQuotaChecker(tableConfig, tableSizeReader, controllerMetrics, isLeaderForTable, resourceManager);
StorageQuotaChecker.QuotaCheckerResponse response;
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 1ac7446592..fa265c4f52 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
@@ -94,7 +94,7 @@ public class SegmentStatusChecker extends ControllerPeriodicTask<SegmentStatusCh
_waitForPushTimeSeconds = config.getStatusCheckerWaitForPushTimeInSeconds();
_tableSizeReader =
new TableSizeReader(executorService, new PoolingHttpClientConnectionManager(), _controllerMetrics,
- _pinotHelixResourceManager);
+ _pinotHelixResourceManager, leadControllerManager);
}
@Override
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java b/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
index 82fadc50c9..dc4e8e2e08 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
@@ -36,6 +36,7 @@ import org.apache.pinot.common.metadata.ZKMetadataProvider;
import org.apache.pinot.common.metrics.ControllerGauge;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.common.restlet.resources.SegmentSizeInfo;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.resources.ServerTableSizeReader;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.spi.config.table.TableConfig;
@@ -55,13 +56,16 @@ public class TableSizeReader {
private final HttpClientConnectionManager _connectionManager;
private final PinotHelixResourceManager _helixResourceManager;
private final ControllerMetrics _controllerMetrics;
+ private final LeadControllerManager _leadControllerManager;
public TableSizeReader(Executor executor, HttpClientConnectionManager connectionManager,
- ControllerMetrics controllerMetrics, PinotHelixResourceManager helixResourceManager) {
+ ControllerMetrics controllerMetrics, PinotHelixResourceManager helixResourceManager,
+ LeadControllerManager leadControllerManager) {
_executor = executor;
_connectionManager = connectionManager;
_controllerMetrics = controllerMetrics;
_helixResourceManager = helixResourceManager;
+ _leadControllerManager = leadControllerManager;
}
/**
@@ -104,11 +108,11 @@ public class TableSizeReader {
Math.max(tableSizeDetails._realtimeSegments._reportedSizePerReplicaInBytes, 0L);
isMissingAllRealtimeSegments =
(tableSizeDetails._realtimeSegments._missingSegments == tableSizeDetails._realtimeSegments._segments.size());
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
+ emitMetrics(realtimeTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
tableSizeDetails._realtimeSegments._estimatedSizeInBytes);
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
- tableSizeDetails._realtimeSegments._estimatedSizeInBytes / _helixResourceManager
- .getNumReplicas(realtimeTableConfig));
+ emitMetrics(realtimeTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
+ tableSizeDetails._realtimeSegments._estimatedSizeInBytes / _helixResourceManager.getNumReplicas(
+ realtimeTableConfig));
long largestSegmentSizeOnServer = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
for (SegmentSizeDetails segmentSizeDetail : tableSizeDetails._realtimeSegments._segments.values()) {
@@ -117,8 +121,7 @@ public class TableSizeReader {
}
}
if (largestSegmentSizeOnServer != DEFAULT_SIZE_WHEN_MISSING_OR_ERROR) {
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER,
- largestSegmentSizeOnServer);
+ emitMetrics(realtimeTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER, largestSegmentSizeOnServer);
}
}
if (hasOfflineTableConfig) {
@@ -131,11 +134,11 @@ public class TableSizeReader {
Math.max(tableSizeDetails._offlineSegments._reportedSizePerReplicaInBytes, 0L);
isMissingAllOfflineSegments =
(tableSizeDetails._offlineSegments._missingSegments == tableSizeDetails._offlineSegments._segments.size());
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
+ emitMetrics(offlineTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
tableSizeDetails._offlineSegments._estimatedSizeInBytes);
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
- tableSizeDetails._offlineSegments._estimatedSizeInBytes / _helixResourceManager
- .getNumReplicas(offlineTableConfig));
+ emitMetrics(offlineTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
+ tableSizeDetails._offlineSegments._estimatedSizeInBytes / _helixResourceManager.getNumReplicas(
+ offlineTableConfig));
long largestSegmentSizeOnServer = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
for (SegmentSizeDetails segmentSizeDetail : tableSizeDetails._offlineSegments._segments.values()) {
@@ -144,8 +147,7 @@ public class TableSizeReader {
}
}
if (largestSegmentSizeOnServer != DEFAULT_SIZE_WHEN_MISSING_OR_ERROR) {
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER,
- largestSegmentSizeOnServer);
+ emitMetrics(offlineTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER, largestSegmentSizeOnServer);
}
}
@@ -160,6 +162,12 @@ public class TableSizeReader {
return tableSizeDetails;
}
+ private void emitMetrics(String tableNameWithType, ControllerGauge controllerGauge, long value) {
+ if (_leadControllerManager.isLeaderForTable(tableNameWithType)) {
+ _controllerMetrics.setValueOfTableGauge(tableNameWithType, controllerGauge, value);
+ }
+ }
+
//
// Reported size below indicates the sizes actually reported by servers on successful responses.
// Estimated sizes indicates the size estimated size with approximated calculations for errored servers
@@ -312,9 +320,7 @@ public class TableSizeReader {
if (subTypeSizeDetails._missingSegments > 0) {
int numSegments = segmentToSizeDetailsMap.size();
int missingPercent = subTypeSizeDetails._missingSegments * 100 / numSegments;
- _controllerMetrics
- .setValueOfTableGauge(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT,
- missingPercent);
+ emitMetrics(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, missingPercent);
if (subTypeSizeDetails._missingSegments == numSegments) {
LOGGER.warn("Failed to get size report for all {} segments of table: {}", numSegments, tableNameWithType);
subTypeSizeDetails._reportedSizeInBytes = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
@@ -325,8 +331,7 @@ public class TableSizeReader {
numSegments, tableNameWithType);
}
} else {
- _controllerMetrics
- .setValueOfTableGauge(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, 0);
+ emitMetrics(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, 0);
}
return subTypeSizeDetails;
diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
index 7fd7a6e572..18f0600b0f 100644
--- a/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
+++ b/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
@@ -42,6 +42,7 @@ import org.apache.pinot.common.metrics.MetricValueUtils;
import org.apache.pinot.common.restlet.resources.SegmentSizeInfo;
import org.apache.pinot.common.restlet.resources.TableSizeInfo;
import org.apache.pinot.common.utils.config.TableConfigUtils;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.controller.util.TableSizeReader;
import org.apache.pinot.controller.utils.FakeHttpServer;
@@ -77,6 +78,7 @@ public class TableSizeReaderTest {
private final HttpClientConnectionManager _connectionManager = new PoolingHttpClientConnectionManager();
private final ControllerMetrics _controllerMetrics =
new ControllerMetrics(PinotMetricUtils.getPinotMetricsRegistry());
+ private final LeadControllerManager _leadControllerManager = null;
private final Map<String, FakeSizeServer> _serverMap = new HashMap<>();
private PinotHelixResourceManager _helix;
@@ -218,8 +220,10 @@ public class TableSizeReaderTest {
}
@Test
- public void testNoSuchTable() throws InvalidConfigException {
- TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix);
+ public void testNoSuchTable()
+ throws InvalidConfigException {
+ TableSizeReader reader =
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix, _leadControllerManager);
assertNull(reader.getTableSizeDetails("mytable", 5000));
}
@@ -239,7 +243,8 @@ public class TableSizeReaderTest {
}
});
- TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix);
+ TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix,
+ _leadControllerManager);
return reader.getTableSizeDetails(table, TIMEOUT_MSEC);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org