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

jackie 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 a61acb71b6 [bugfix] Remove deleting segments from table status info 
(#15725)
a61acb71b6 is described below

commit a61acb71b634da10e637b61fc76e0b8aaa142659
Author: Soumya Himanish Mohapatra 
<30361728+himanish-s...@users.noreply.github.com>
AuthorDate: Tue May 27 23:07:42 2025 +0530

    [bugfix] Remove deleting segments from table status info (#15725)
---
 .../controller/api/resources/DebugResource.java    |  2 +-
 .../api/resources/PinotSegmentRestletResource.java |  2 +-
 .../pinot/controller/api/resources/TableSize.java  |  5 ++-
 .../pinot/controller/api/resources/TableViews.java | 43 ++++++++++++++-----
 .../controller/helix/SegmentStatusChecker.java     |  2 +-
 .../helix/core/PinotHelixResourceManager.java      | 17 ++++++--
 .../helix/core/rebalance/TableRebalancer.java      |  2 +-
 .../pinot/controller/util/TableSizeReader.java     | 48 ++++++++++++++--------
 .../controller/validation/StorageQuotaChecker.java |  2 +-
 .../src/main/resources/app/requests/index.ts       |  8 ++--
 .../pinot/controller/api/TableSizeReaderTest.java  |  8 ++--
 .../resources/PinotSegmentRestletResourceTest.java |  4 +-
 .../controller/helix/SegmentStatusCheckerTest.java | 15 ++++---
 .../validation/StorageQuotaCheckerTest.java        |  2 +-
 14 files changed, 107 insertions(+), 53 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 906070a3b1..6a2235389c 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
@@ -240,7 +240,7 @@ public class DebugResource {
     TableSizeReader.TableSizeDetails tableSizeDetails;
     try {
       tableSizeDetails = _tableSizeReader
-          .getTableSizeDetails(tableNameWithType, 
_controllerConf.getServerAdminRequestTimeoutSeconds() * 1000);
+          .getTableSizeDetails(tableNameWithType, 
_controllerConf.getServerAdminRequestTimeoutSeconds() * 1000, true);
     } catch (Throwable t) {
       tableSizeDetails = null;
     }
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java
index 7455ac5f4e..17de0fca8f 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java
@@ -631,7 +631,7 @@ public class PinotSegmentRestletResource {
       @Nullable String instanceName) {
     if (segmentNames == null) {
       // instanceName can be null or not null, and this method below can 
handle both cases.
-      return 
_pinotHelixResourceManager.getServerToSegmentsMap(tableNameWithType, 
instanceName);
+      return 
_pinotHelixResourceManager.getServerToSegmentsMap(tableNameWithType, 
instanceName, true);
     }
     // Skip servers and segments not involved in the segment reloading job.
     List<String> segmnetNameList = new ArrayList<>();
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 ede9d3eb73..5995450200 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
@@ -85,12 +85,15 @@ public class TableSize {
       @ApiParam(value = "Table name without type", required = true, example = 
"myTable | myTable_OFFLINE")
       @PathParam("tableName") String tableName,
       @ApiParam(value = "Provide detailed information") @DefaultValue("true") 
@QueryParam("verbose") boolean verbose,
+      @ApiParam(value = "Include replaced segments") @DefaultValue("true")
+      @QueryParam("includeReplacedSegments") boolean includeReplacedSegments,
       @Context HttpHeaders headers) {
     tableName = DatabaseUtils.translateTableName(tableName, headers);
     TableSizeReader.TableSizeDetails tableSizeDetails = null;
     try {
       tableSizeDetails =
-          _tableSizeReader.getTableSizeDetails(tableName, 
_controllerConf.getServerAdminRequestTimeoutSeconds() * 1000);
+          _tableSizeReader.getTableSizeDetails(tableName, 
_controllerConf.getServerAdminRequestTimeoutSeconds() * 1000,
+              includeReplacedSegments);
       if (!verbose) {
         if (tableSizeDetails._offlineSegments != null) {
           tableSizeDetails._offlineSegments._segments = new HashMap<>();
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableViews.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableViews.java
index 41bda73670..9e71660dc3 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableViews.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableViews.java
@@ -32,10 +32,12 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -48,6 +50,9 @@ import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.helix.model.ExternalView;
 import org.apache.helix.model.IdealState;
+import org.apache.pinot.common.lineage.SegmentLineage;
+import org.apache.pinot.common.lineage.SegmentLineageAccessHelper;
+import org.apache.pinot.common.lineage.SegmentLineageUtils;
 import org.apache.pinot.common.utils.DatabaseUtils;
 import 
org.apache.pinot.controller.api.exception.ControllerApplicationException;
 import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
@@ -141,28 +146,44 @@ public class TableViews {
   public String getSegmentsStatusDetails(
       @ApiParam(value = "Name of the table", required = true) 
@PathParam("tableName") String tableName,
       @ApiParam(value = "realtime|offline", required = false) 
@QueryParam("tableType") String tableTypeStr,
+      @ApiParam(value = "Include segments being replaced", required = false)
+      @QueryParam("includeReplacedSegments") @DefaultValue("true") boolean 
includeReplacedSegments,
       @Context HttpHeaders headers)
       throws JsonProcessingException {
     tableName = DatabaseUtils.translateTableName(tableName, headers);
     TableType tableType = validateTableType(tableTypeStr);
     TableViews.TableView externalView = getTableState(tableName, 
TableViews.EXTERNALVIEW, tableType);
     TableViews.TableView idealStateView = getTableState(tableName, 
TableViews.IDEALSTATE, tableType);
-    List<SegmentStatusInfo> segmentStatusInfoListMap = new ArrayList<>();
-    segmentStatusInfoListMap = getSegmentStatuses(externalView, 
idealStateView);
+
+    Map<String, Map<String, String>> externalViewStateMap = 
getStateMap(externalView);
+    Map<String, Map<String, String>> idealStateMap = 
getStateMap(idealStateView);
+    Set<String> segments = idealStateMap.keySet();
+
+    if (!includeReplacedSegments) {
+      SegmentLineage segmentLineage = SegmentLineageAccessHelper
+          .getSegmentLineage(_pinotHelixResourceManager.getPropertyStore(), 
tableName);
+      SegmentLineageUtils
+          .filterSegmentsBasedOnLineageInPlace(segments, segmentLineage);
+    }
+
+    List<SegmentStatusInfo> segmentStatusInfoListMap = 
getSegmentStatuses(externalViewStateMap, idealStateMap);
+
     return JsonUtils.objectToPrettyString(segmentStatusInfoListMap);
   }
 
-  public List<SegmentStatusInfo> getSegmentStatuses(TableViews.TableView 
externalView,
-      TableViews.TableView idealStateView) {
-    Map<String, Map<String, String>> idealStateMap = 
getStateMap(idealStateView);
-    Map<String, Map<String, String>> externalViewMap = 
getStateMap(externalView);
+  public List<SegmentStatusInfo> getSegmentStatuses(Map<String, Map<String, 
String>> externalViewMap,
+      Map<String, Map<String, String>> idealStateMap) {
     List<SegmentStatusInfo> segmentStatusInfoList = new ArrayList<>();
 
-    for (Map.Entry<String, Map<String, String>> entry : 
externalViewMap.entrySet()) {
+    for (Map.Entry<String, Map<String, String>> entry : 
idealStateMap.entrySet()) {
       String segment = entry.getKey();
-      Map<String, String> externalViewEntryValue = entry.getValue();
-      Map<String, String> idealViewEntryValue = idealStateMap.get(segment);
-      if (isErrorSegment(externalViewEntryValue)) {
+      Map<String, String> externalViewEntryValue = 
externalViewMap.get(segment);
+      Map<String, String> idealViewEntryValue = entry.getValue();
+
+      if (externalViewEntryValue == null) {
+        segmentStatusInfoList.add(
+            new SegmentStatusInfo(segment, 
CommonConstants.Helix.StateModel.DisplaySegmentStatus.UPDATING));
+      } else if (isErrorSegment(externalViewEntryValue)) {
         segmentStatusInfoList.add(
             new SegmentStatusInfo(segment, 
CommonConstants.Helix.StateModel.DisplaySegmentStatus.BAD));
       } else {
@@ -210,7 +231,7 @@ public class TableViews {
     return tableTypeViewResult;
   }
 
-  private Map<String, Map<String, String>> getStateMap(TableViews.TableView 
view) {
+  public Map<String, Map<String, String>> getStateMap(TableViews.TableView 
view) {
     if (view != null && view._offline != null && !view._offline.isEmpty()) {
       return view._offline;
     } else if (view != null && view._realtime != null && 
!view._realtime.isEmpty()) {
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 bc3f2fb263..a86bbaf10a 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
@@ -202,7 +202,7 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
 
   private void updateTableSizeMetrics(String tableNameWithType)
       throws InvalidConfigException {
-    _tableSizeReader.getTableSizeDetails(tableNameWithType, 
TABLE_CHECKER_TIMEOUT_MS);
+    _tableSizeReader.getTableSizeDetails(tableNameWithType, 
TABLE_CHECKER_TIMEOUT_MS, true);
   }
 
   /**
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
index 09bd904aee..969aab1c2f 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
@@ -3274,16 +3274,27 @@ public class PinotHelixResourceManager {
    * the ideal state because they are not supposed to be served.
    */
   public Map<String, List<String>> getServerToSegmentsMap(String 
tableNameWithType) {
-    return getServerToSegmentsMap(tableNameWithType, null);
+    return getServerToSegmentsMap(tableNameWithType, null, true);
   }
 
-  public Map<String, List<String>> getServerToSegmentsMap(String 
tableNameWithType, @Nullable String targetServer) {
+  public Map<String, List<String>> getServerToSegmentsMap(String 
tableNameWithType, @Nullable String targetServer,
+      boolean includeReplacedSegments) {
     Map<String, List<String>> serverToSegmentsMap = new TreeMap<>();
     IdealState idealState = 
_helixAdmin.getResourceIdealState(_helixClusterName, tableNameWithType);
     if (idealState == null) {
       throw new IllegalStateException("Ideal state does not exist for table: " 
+ tableNameWithType);
     }
-    for (Map.Entry<String, Map<String, String>> entry : 
idealState.getRecord().getMapFields().entrySet()) {
+
+    Map<String, Map<String, String>> idealStateMap = 
idealState.getRecord().getMapFields();
+    Set<String> segments = idealStateMap.keySet();
+
+    if (!includeReplacedSegments) {
+      SegmentLineage segmentLineage = SegmentLineageAccessHelper
+          .getSegmentLineage(getPropertyStore(), tableNameWithType);
+      SegmentLineageUtils.filterSegmentsBasedOnLineageInPlace(segments, 
segmentLineage);
+    }
+
+    for (Map.Entry<String, Map<String, String>> entry : 
idealStateMap.entrySet()) {
       String segmentName = entry.getKey();
       for (Map.Entry<String, String> instanceStateEntry : 
entry.getValue().entrySet()) {
         String server = instanceStateEntry.getKey();
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
index a89f62b41e..d96b646089 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
@@ -658,7 +658,7 @@ public class TableRebalancer {
     tableRebalanceLogger.info("Fetching the table size");
     try {
       TableSizeReader.TableSubTypeSizeDetails sizeDetails =
-          _tableSizeReader.getTableSubtypeSize(tableNameWithType, 
TABLE_SIZE_READER_TIMEOUT_MS);
+          _tableSizeReader.getTableSubtypeSize(tableNameWithType, 
TABLE_SIZE_READER_TIMEOUT_MS, true);
       tableRebalanceLogger.info("Fetched the table size details");
       return sizeDetails;
     } catch (InvalidConfigException e) {
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 24148bc69d..eb134cbfbc 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
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.BiMap;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -76,10 +77,12 @@ public class TableSizeReader {
    * Returns null if the table is not found.
    * @param tableName table name without type
    * @param timeoutMsec timeout in milliseconds for reading table sizes from 
server
+   * @param includeReplacedSegments include replaced segments in table size 
calculation
    * @return
    */
   @Nullable
-  public TableSizeDetails getTableSizeDetails(@Nonnull String tableName, 
@Nonnegative int timeoutMsec)
+  public TableSizeDetails getTableSizeDetails(@Nonnull String tableName, 
@Nonnegative int timeoutMsec,
+      boolean includeReplacedSegments)
       throws InvalidConfigException {
     Preconditions.checkNotNull(tableName, "Table name should not be null");
     Preconditions.checkArgument(timeoutMsec > 0, "Timeout value must be 
greater than 0");
@@ -100,7 +103,7 @@ public class TableSizeReader {
     TableSizeDetails tableSizeDetails = new TableSizeDetails(tableName);
     if (hasRealtimeTableConfig) {
       String realtimeTableName = 
TableNameBuilder.REALTIME.tableNameWithType(tableName);
-      tableSizeDetails._realtimeSegments = 
getTableSubtypeSize(realtimeTableName, timeoutMsec);
+      tableSizeDetails._realtimeSegments = 
getTableSubtypeSize(realtimeTableName, timeoutMsec, includeReplacedSegments);
       // taking max(0,value) as values as set to -1 if all the segments are in 
error
       tableSizeDetails._reportedSizeInBytes += 
Math.max(tableSizeDetails._realtimeSegments._reportedSizeInBytes, 0L);
       tableSizeDetails._estimatedSizeInBytes += 
Math.max(tableSizeDetails._realtimeSegments._estimatedSizeInBytes, 0L);
@@ -126,7 +129,7 @@ public class TableSizeReader {
     }
     if (hasOfflineTableConfig) {
       String offlineTableName = 
TableNameBuilder.OFFLINE.tableNameWithType(tableName);
-      tableSizeDetails._offlineSegments = 
getTableSubtypeSize(offlineTableName, timeoutMsec);
+      tableSizeDetails._offlineSegments = 
getTableSubtypeSize(offlineTableName, timeoutMsec, includeReplacedSegments);
       // taking max(0,value) as values as set to -1 if all the segments are in 
error
       tableSizeDetails._reportedSizeInBytes += 
Math.max(tableSizeDetails._offlineSegments._reportedSizeInBytes, 0L);
       tableSizeDetails._estimatedSizeInBytes += 
Math.max(tableSizeDetails._offlineSegments._estimatedSizeInBytes, 0L);
@@ -241,9 +244,11 @@ public class TableSizeReader {
     public Map<String, SegmentSizeInfo> _serverInfo = new HashMap<>();
   }
 
-  public TableSubTypeSizeDetails getTableSubtypeSize(String tableNameWithType, 
int timeoutMs)
+  public TableSubTypeSizeDetails getTableSubtypeSize(String tableNameWithType, 
int timeoutMs,
+      boolean includeReplacedSegments)
       throws InvalidConfigException {
-    Map<String, List<String>> serverToSegmentsMap = 
_helixResourceManager.getServerToSegmentsMap(tableNameWithType);
+    Map<String, List<String>> serverToSegmentsMap = 
_helixResourceManager.getServerToSegmentsMap(tableNameWithType,
+        null, includeReplacedSegments);
     ServerTableSizeReader serverTableSizeReader = new 
ServerTableSizeReader(_executor, _connectionManager);
     BiMap<String, String> endpoints = 
_helixResourceManager.getDataInstanceAdminEndpoints(serverToSegmentsMap.keySet());
     Map<String, List<SegmentSizeInfo>> serverToSegmentSizeInfoListMap =
@@ -252,23 +257,30 @@ public class TableSizeReader {
     TableSubTypeSizeDetails subTypeSizeDetails = new TableSubTypeSizeDetails();
     Map<String, SegmentSizeDetails> segmentToSizeDetailsMap = 
subTypeSizeDetails._segments;
 
+    Map<String, Map<String, SegmentSizeInfo>> serverToSegmentMap = new 
HashMap<>();
+    for (Map.Entry<String, List<SegmentSizeInfo>> entry : 
serverToSegmentSizeInfoListMap.entrySet()) {
+      Map<String, SegmentSizeInfo> segmentMap = new HashMap<>();
+      for (SegmentSizeInfo info : entry.getValue()) {
+        segmentMap.put(info.getSegmentName(), info);
+      }
+      serverToSegmentMap.put(entry.getKey(), segmentMap);
+    }
+
     // Convert map from (server -> List<SegmentSizeInfo>) to (segment -> 
SegmentSizeDetails (server -> SegmentSizeInfo))
     // If no response returned from a server, put -1 as size for all the 
segments on the server
-    // TODO: here we assume server contains all segments in ideal state, which 
might not be the case
     for (Map.Entry<String, List<String>> entry : 
serverToSegmentsMap.entrySet()) {
       String server = entry.getKey();
-      List<SegmentSizeInfo> segmentSizeInfoList = 
serverToSegmentSizeInfoListMap.get(server);
-      if (segmentSizeInfoList != null) {
-        for (SegmentSizeInfo segmentSizeInfo : segmentSizeInfoList) {
-          SegmentSizeDetails segmentSizeDetails =
-              
segmentToSizeDetailsMap.computeIfAbsent(segmentSizeInfo.getSegmentName(), k -> 
new SegmentSizeDetails());
-          segmentSizeDetails._serverInfo.put(server, segmentSizeInfo);
-        }
-      } else {
-        List<String> segments = entry.getValue();
-        for (String segment : segments) {
-          SegmentSizeDetails segmentSizeDetails =
-              segmentToSizeDetailsMap.computeIfAbsent(segment, k -> new 
SegmentSizeDetails());
+      Map<String, SegmentSizeInfo> segmentToSegmentSizeInfoMap = 
serverToSegmentMap.getOrDefault(server,
+          Collections.emptyMap());
+
+      List<String> segments = entry.getValue();
+      for (String segment : segments) {
+        SegmentSizeDetails segmentSizeDetails =
+            segmentToSizeDetailsMap.computeIfAbsent(segment, k -> new 
SegmentSizeDetails());
+
+        if (segmentToSegmentSizeInfoMap.containsKey(segment)) {
+          segmentSizeDetails._serverInfo.put(server, 
segmentToSegmentSizeInfoMap.get(segment));
+        } else {
           segmentSizeDetails._serverInfo.put(server, new 
SegmentSizeInfo(segment, DEFAULT_SIZE_WHEN_MISSING_OR_ERROR));
         }
       }
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/validation/StorageQuotaChecker.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/validation/StorageQuotaChecker.java
index 37fbda8698..3c0359c960 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/validation/StorageQuotaChecker.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/validation/StorageQuotaChecker.java
@@ -110,7 +110,7 @@ public class StorageQuotaChecker {
     // read table size
     TableSizeReader.TableSubTypeSizeDetails tableSubtypeSize;
     try {
-      tableSubtypeSize = 
_tableSizeReader.getTableSubtypeSize(tableNameWithType, _timeoutMs);
+      tableSubtypeSize = 
_tableSizeReader.getTableSubtypeSize(tableNameWithType, _timeoutMs, true);
     } catch (InvalidConfigException e) {
       LOGGER.error("Failed to get table size for table {}", tableNameWithType, 
e);
       throw e;
diff --git a/pinot-controller/src/main/resources/app/requests/index.ts 
b/pinot-controller/src/main/resources/app/requests/index.ts
index dc08e09cb7..42ecfccbcb 100644
--- a/pinot-controller/src/main/resources/app/requests/index.ts
+++ b/pinot-controller/src/main/resources/app/requests/index.ts
@@ -98,8 +98,8 @@ export const putSchema = (name: string, params: string, 
reload?: boolean): Promi
 export const getSegmentMetadata = (tableName: string, segmentName: string): 
Promise<AxiosResponse<SegmentMetadata>> =>
   baseApi.get(`/segments/${tableName}/${segmentName}/metadata?columns=*`);
 
-export const getTableSize = (name: string, verbose: boolean = false): 
Promise<AxiosResponse<TableSize>> =>
-  baseApi.get(`/tables/${name}/size?verbose=${verbose}`);
+export const getTableSize = (name: string, verbose: boolean = false, 
includeReplacedSegments: boolean = false): Promise<AxiosResponse<TableSize>> =>
+  
baseApi.get(`/tables/${name}/size?verbose=${verbose}&includeReplacedSegments=${includeReplacedSegments}`);
 
 export const getIdealState = (name: string): 
Promise<AxiosResponse<IdealState>> =>
   baseApi.get(`/tables/${name}/idealstate`);
@@ -110,8 +110,8 @@ export const getExternalView = (name: string): 
Promise<AxiosResponse<IdealState>
 export const getServerToSegmentsCount = (name: string, tableType: TableType, 
verbose: boolean = false): Promise<AxiosResponse<ServerToSegmentsCount[]>> =>
   
baseApi.get(`/segments/${name}/servers?type=${tableType}&verbose=${verbose}`);
 
-export const getSegmentsStatus = (name: string): 
Promise<AxiosResponse<SegmentStatusInfo[]>> =>
-  baseApi.get(`/tables/${name}/segmentsStatus`);
+export const getSegmentsStatus = (name: string, includeReplacedSegments: 
boolean = false): Promise<AxiosResponse<SegmentStatusInfo[]>> =>
+  
baseApi.get(`/tables/${name}/segmentsStatus?includeReplacedSegments=${includeReplacedSegments}`);
 
 // Fetch consuming segments information for a table
 // API: GET /tables/{tableName}/consumingSegmentsInfo
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 1c7731da4b..75b2b11099 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
@@ -61,6 +61,8 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -226,12 +228,12 @@ public class TableSizeReaderTest {
       throws InvalidConfigException {
     TableSizeReader reader =
         new TableSizeReader(_executor, _connectionManager, _controllerMetrics, 
_helix, _leadControllerManager);
-    assertNull(reader.getTableSizeDetails("mytable", 5000));
+    assertNull(reader.getTableSizeDetails("mytable", 5000, true));
   }
 
   private TableSizeReader.TableSizeDetails testRunner(final String[] servers, 
String table)
       throws InvalidConfigException {
-    when(_helix.getServerToSegmentsMap(anyString())).thenAnswer(new 
Answer<Object>() {
+    when(_helix.getServerToSegmentsMap(anyString(), any(), 
anyBoolean())).thenAnswer(new Answer<Object>() {
       @Override
       public Object answer(InvocationOnMock invocationOnMock) throws Throwable 
{
         return subsetOfServerSegments(servers);
@@ -247,7 +249,7 @@ public class TableSizeReaderTest {
 
     TableSizeReader reader = new TableSizeReader(_executor, 
_connectionManager, _controllerMetrics, _helix,
         _leadControllerManager);
-    return reader.getTableSizeDetails(table, TIMEOUT_MSEC);
+    return reader.getTableSizeDetails(table, TIMEOUT_MSEC, true);
   }
 
   private Map<String, List<String>> segmentToServers(final String... servers) {
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResourceTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResourceTest.java
index d7350a17ed..9117467bdf 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResourceTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResourceTest.java
@@ -60,8 +60,8 @@ public class PinotSegmentRestletResourceTest {
     fullServerToSegmentsMap.put("svr01", new ArrayList<>(List.of("seg01", 
"seg02")));
     fullServerToSegmentsMap.put("svr02", new ArrayList<>(List.of("seg02", 
"seg03")));
     fullServerToSegmentsMap.put("svr03", new ArrayList<>(List.of("seg03", 
"seg01")));
-    when(_pinotHelixResourceManager.getServerToSegmentsMap(tableName, 
null)).thenReturn(fullServerToSegmentsMap);
-    when(_pinotHelixResourceManager.getServerToSegmentsMap(tableName, 
"svr02")).thenReturn(
+    when(_pinotHelixResourceManager.getServerToSegmentsMap(tableName, null, 
true)).thenReturn(fullServerToSegmentsMap);
+    when(_pinotHelixResourceManager.getServerToSegmentsMap(tableName, "svr02", 
true)).thenReturn(
         Map.of("svr02", new ArrayList<>(List.of("seg02", "seg03"))));
     when(_pinotHelixResourceManager.getServers(tableName, 
"seg01")).thenReturn(Set.of("svr01", "svr03"));
 
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 84ceb96843..f2a949051e 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
@@ -780,7 +780,8 @@ public class SegmentStatusCheckerTest {
     tableViewExternal._offline = tableViewExternalOffline;
     tableViewIdeal._offline = tableViewIdealOffline;
     TableViews tableviews = new TableViews();
-    List<SegmentStatusInfo> segmentStatusInfos = 
tableviews.getSegmentStatuses(tableViewExternal, tableViewIdeal);
+    List<SegmentStatusInfo> segmentStatusInfos = tableviews.getSegmentStatuses(
+        tableviews.getStateMap(tableViewExternal), 
tableviews.getStateMap(tableViewIdeal));
     assertEquals(segmentStatusInfos.get(0).getSegmentStatus(),
         CommonConstants.Helix.StateModel.DisplaySegmentStatus.GOOD);
     assertEquals(segmentStatusInfos.get(1).getSegmentStatus(),
@@ -804,7 +805,8 @@ public class SegmentStatusCheckerTest {
     tableViewExternal._offline = tableViewExternalOffline;
     tableViewIdeal._offline = tableViewIdealOffline;
     TableViews tableviews = new TableViews();
-    List<SegmentStatusInfo> segmentStatusInfos = 
tableviews.getSegmentStatuses(tableViewExternal, tableViewIdeal);
+    List<SegmentStatusInfo> segmentStatusInfos = tableviews.getSegmentStatuses(
+        tableviews.getStateMap(tableViewExternal), 
tableviews.getStateMap(tableViewIdeal));
     assertEquals(segmentStatusInfos.get(0).getSegmentStatus(),
         CommonConstants.Helix.StateModel.DisplaySegmentStatus.GOOD);
     assertEquals(segmentStatusInfos.get(1).getSegmentStatus(),
@@ -828,7 +830,8 @@ public class SegmentStatusCheckerTest {
     tableViewExternal._offline = tableViewExternalOffline;
     tableViewIdeal._offline = tableViewIdealOffline;
     TableViews tableviews = new TableViews();
-    List<SegmentStatusInfo> segmentStatusInfos = 
tableviews.getSegmentStatuses(tableViewExternal, tableViewIdeal);
+    List<SegmentStatusInfo> segmentStatusInfos = tableviews.getSegmentStatuses(
+        tableviews.getStateMap(tableViewExternal), 
tableviews.getStateMap(tableViewIdeal));
     assertEquals(segmentStatusInfos.get(0).getSegmentStatus(),
         CommonConstants.Helix.StateModel.DisplaySegmentStatus.BAD);
     assertEquals(segmentStatusInfos.get(1).getSegmentStatus(),
@@ -852,7 +855,8 @@ public class SegmentStatusCheckerTest {
     tableViewExternal._offline = tableViewExternalOffline;
     tableViewIdeal._offline = tableViewIdealOffline;
     TableViews tableviews = new TableViews();
-    List<SegmentStatusInfo> segmentStatusInfos = 
tableviews.getSegmentStatuses(tableViewExternal, tableViewIdeal);
+    List<SegmentStatusInfo> segmentStatusInfos = tableviews.getSegmentStatuses(
+        tableviews.getStateMap(tableViewExternal), 
tableviews.getStateMap(tableViewIdeal));
     assertEquals(segmentStatusInfos.get(0).getSegmentStatus(),
         CommonConstants.Helix.StateModel.DisplaySegmentStatus.UPDATING);
     assertEquals(segmentStatusInfos.get(1).getSegmentStatus(),
@@ -880,7 +884,8 @@ public class SegmentStatusCheckerTest {
     tableViewExternal._offline = tableViewExternalOffline;
     tableViewIdeal._offline = tableViewIdealOffline;
     TableViews tableviews = new TableViews();
-    List<SegmentStatusInfo> segmentStatusInfos = 
tableviews.getSegmentStatuses(tableViewExternal, tableViewIdeal);
+    List<SegmentStatusInfo> segmentStatusInfos = tableviews.getSegmentStatuses(
+        tableviews.getStateMap(tableViewExternal), 
tableviews.getStateMap(tableViewIdeal));
     assertEquals(segmentStatusInfos.get(0).getSegmentStatus(),
         CommonConstants.Helix.StateModel.DisplaySegmentStatus.GOOD);
     assertEquals(segmentStatusInfos.get(1).getSegmentStatus(),
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/validation/StorageQuotaCheckerTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/validation/StorageQuotaCheckerTest.java
index 3e42be2f50..9e6b896143 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/validation/StorageQuotaCheckerTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/validation/StorageQuotaCheckerTest.java
@@ -192,6 +192,6 @@ public class StorageQuotaCheckerTest {
     tableSizeResult._estimatedSizeInBytes = tableSizeInBytes;
     tableSizeResult._segments = Collections.emptyMap();
     tableSizeResult._missingSegments = numMissingSegments;
-    when(_tableSizeReader.getTableSubtypeSize(tableName, 
1000)).thenReturn(tableSizeResult);
+    when(_tableSizeReader.getTableSubtypeSize(tableName, 1000, 
true)).thenReturn(tableSizeResult);
   }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to