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 <j...@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-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to