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 269f483c3c add server status to all instance tables (#14720)
269f483c3c is described below

commit 269f483c3c585db1ab6e94ac53ff8d2eeca500d1
Author: Johan Adami <4760722+jadam...@users.noreply.github.com>
AuthorDate: Mon Jan 13 22:03:05 2025 -0500

    add server status to all instance tables (#14720)
---
 .../app/components/AsyncInstanceTable.tsx          | 19 +++-------------
 .../app/components/Homepage/InstancesTables.tsx    |  3 +--
 .../src/main/resources/app/pages/TenantDetails.tsx |  7 ++++--
 .../src/main/resources/app/pages/Tenants.tsx       | 25 +++++++++++++++-------
 .../main/resources/app/utils/PinotMethodUtils.ts   | 16 +++++++++++++-
 5 files changed, 41 insertions(+), 29 deletions(-)

diff --git 
a/pinot-controller/src/main/resources/app/components/AsyncInstanceTable.tsx 
b/pinot-controller/src/main/resources/app/components/AsyncInstanceTable.tsx
index 12d6b94a0c..c6a06b9a24 100644
--- a/pinot-controller/src/main/resources/app/components/AsyncInstanceTable.tsx
+++ b/pinot-controller/src/main/resources/app/components/AsyncInstanceTable.tsx
@@ -25,28 +25,15 @@ import PinotMethodUtils from '../utils/PinotMethodUtils';
 import Utils from '../utils/Utils';
 import Loading from './Loading';
 
-type BaseProps = {
+type Props = {
   instanceType: InstanceType;
   showInstanceDetails?: boolean;
   instanceNames: string[] | null;
   liveInstanceNames?: string[];
 };
 
-type ClusterProps = BaseProps & {
-  cluster: string;
-  tenant?: never;
-};
-
-type TenantProps = BaseProps & {
-  tenant: string;
-  cluster?: never;
-};
-
-type Props = ClusterProps | TenantProps;
-
 export const AsyncInstanceTable = ({
   instanceType,
-  cluster,
   instanceNames,
   liveInstanceNames,
   showInstanceDetails = false,
@@ -70,10 +57,10 @@ export const AsyncInstanceTable = ({
 
   useEffect(() => {
     // async load all the other details
-    if(showInstanceDetails && cluster && instanceNames && liveInstanceNames) {
+    if(showInstanceDetails && instanceNames && liveInstanceNames) {
       fetchAdditionalInstanceDetails();
     }
-  }, [showInstanceDetails, cluster, instanceNames, liveInstanceNames]);
+  }, [showInstanceDetails, instanceNames, liveInstanceNames]);
 
   const fetchAdditionalInstanceDetails = async () => {
     const additionalData = await PinotMethodUtils.getInstanceData(
diff --git 
a/pinot-controller/src/main/resources/app/components/Homepage/InstancesTables.tsx
 
b/pinot-controller/src/main/resources/app/components/Homepage/InstancesTables.tsx
index dd5621f447..3b466165c8 100644
--- 
a/pinot-controller/src/main/resources/app/components/Homepage/InstancesTables.tsx
+++ 
b/pinot-controller/src/main/resources/app/components/Homepage/InstancesTables.tsx
@@ -30,7 +30,7 @@ type Props = {
 };
 
 
-const Instances = ({ clusterName, instanceType, instances, liveInstanceNames 
}: Props) => {
+const Instances = ({ instanceType, instances, liveInstanceNames }: Props) => {
   const order = [
     InstanceType.CONTROLLER,
     InstanceType.BROKER,
@@ -45,7 +45,6 @@ const Instances = ({ clusterName, instanceType, instances, 
liveInstanceNames }:
           return (
             <AsyncInstanceTable
               key={startCase(key)}
-              cluster={clusterName}
               instanceType={key}
               showInstanceDetails
               instanceNames={instances?.[key] || null}
diff --git a/pinot-controller/src/main/resources/app/pages/TenantDetails.tsx 
b/pinot-controller/src/main/resources/app/pages/TenantDetails.tsx
index a761f15fba..6054a0d353 100644
--- a/pinot-controller/src/main/resources/app/pages/TenantDetails.tsx
+++ b/pinot-controller/src/main/resources/app/pages/TenantDetails.tsx
@@ -130,7 +130,7 @@ const TenantPageDetails = ({ match }: 
RouteComponentProps<Props>) => {
   const [showEditConfig, setShowEditConfig] = useState(false);
   const [config, setConfig] = useState('{}');
 
-  const instanceColumns = ["Instance Name", "# of segments"];
+  const instanceColumns = ["Instance Name", "# of segments", "Status"];
   const loadingInstanceData = Utils.getLoadingTableData(instanceColumns);
   const [instanceCountData, setInstanceCountData] = 
useState<TableData>(loadingInstanceData);
 
@@ -187,10 +187,13 @@ const TenantPageDetails = ({ match }: 
RouteComponentProps<Props>) => {
   const fetchSegmentData = async () => {
     const result = await PinotMethodUtils.getSegmentList(tableName);
     const data = await 
PinotMethodUtils.fetchServerToSegmentsCountData(tableName, tableType);
+    const liveInstanceNames = await PinotMethodUtils.getLiveInstances();
     const {columns, records} = result;
     setInstanceCountData({
       columns: instanceColumns,
-      records: data.records
+      records: data.records.map((record) => {
+        return [...record, liveInstanceNames.data.includes(record[0]) ? 
'Alive' : 'Dead'];
+      })
     });
 
     const segmentTableRows = [];
diff --git a/pinot-controller/src/main/resources/app/pages/Tenants.tsx 
b/pinot-controller/src/main/resources/app/pages/Tenants.tsx
index e43c17c36b..e1a1697c91 100644
--- a/pinot-controller/src/main/resources/app/pages/Tenants.tsx
+++ b/pinot-controller/src/main/resources/app/pages/Tenants.tsx
@@ -46,6 +46,7 @@ const TenantPage = ({ match }: RouteComponentProps<Props>) => 
{
     [InstanceType.BROKER]: null,
     [InstanceType.SERVER]: null,
   })
+  const [liveInstanceNames, setLiveInstanceNames] = useState<string[]>();
 
   useEffect(() => {
      fetchInstanceData();
@@ -58,6 +59,10 @@ const TenantPage = ({ match }: RouteComponentProps<Props>) 
=> {
       [InstanceType.BROKER]: Array.isArray(brokerNames) ? brokerNames : [],
       [InstanceType.SERVER]: Array.isArray(serverNames) ? serverNames : [],
     });
+
+    const liveInstanceNames = await PinotMethodUtils.getLiveInstances();
+    setLiveInstanceNames(liveInstanceNames.data || []);
+
   }
 
   return (
@@ -76,16 +81,18 @@ const TenantPage = ({ match }: RouteComponentProps<Props>) 
=> {
           <div>
             <CustomButton
               onClick={() => {}}
-              tooltipTitle="Recalculates the segment to server mapping for all 
tables in this tenant"
-              enableTooltip={true}
+              // Tooltips do not render on disabled buttons. Add this back 
when we have a working implementation.
+              // tooltipTitle="Recalculates the segment to server mapping for 
all tables in this tenant"
+              // enableTooltip={true}
               isDisabled={true}
             >
               Rebalance Server Tenant
             </CustomButton>
             <CustomButton
               onClick={() => {}}
-              tooltipTitle="Rebuilds brokerResource mappings for all tables in 
this tenant"
-              enableTooltip={true}
+              // Tooltips do not render on disabled buttons. Add this back 
when we have a working implementation.
+              // tooltipTitle="Rebuilds brokerResource mappings for all tables 
in this tenant"
+              // enableTooltip={true}
               isDisabled={true}
             >
               Rebuild Broker Resource
@@ -99,18 +106,20 @@ const TenantPage = ({ match }: RouteComponentProps<Props>) 
=> {
         baseUrl={`/tenants/${tenantName}/table/`}
       />
       <Grid container spacing={2}>
-        <Grid item xs={6}>
+        <Grid item xs={12}>
           <AsyncInstanceTable
             instanceNames={instanceNames[InstanceType.BROKER]}
             instanceType={InstanceType.BROKER}
-            tenant={tenantName}
+            liveInstanceNames={liveInstanceNames}
+            showInstanceDetails
           />
         </Grid>
-        <Grid item xs={6}>
+        <Grid item xs={12}>
           <AsyncInstanceTable
             instanceNames={instanceNames[InstanceType.SERVER]}
             instanceType={InstanceType.SERVER}
-            tenant={tenantName}
+            liveInstanceNames={liveInstanceNames}
+            showInstanceDetails
           />
         </Grid>
       </Grid>
diff --git a/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts 
b/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
index 4207e59f47..a4f1bae1fc 100644
--- a/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
+++ b/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
@@ -199,13 +199,26 @@ const getClusterName = () => {
 // This method is used to fetch array of live instances name
 // API: /zk/ls?path=:ClusterName/LIVEINSTANCES
 // Expected Output: []
-const getLiveInstance = (clusterName) => {
+const getLiveInstance = (clusterName: string) => {
   const params = encodeURIComponent(`/${clusterName}/LIVEINSTANCES`);
   return zookeeperGetList(params).then((data) => {
     return data;
   });
 };
 
+const getLiveInstances = () => {
+  let localclusterName: string | null = 
localStorage.getItem('pinot_ui:clusterName');
+  let clusterNameRes: Promise<string>;
+  if(!localclusterName || localclusterName === ''){
+    clusterNameRes = getClusterName();
+  } else {
+    clusterNameRes = Promise.resolve(localclusterName);
+  }
+  return clusterNameRes.then((clusterName) => {
+    return getLiveInstance(clusterName);
+  });
+};
+
 // This method is used to diaplay cluster congifuration on cluster manager 
home page
 // API: /cluster/configs
 // Expected Output: {columns: [], records: []}
@@ -1277,6 +1290,7 @@ export default {
   getSegmentCountAndStatus,
   getClusterName,
   getLiveInstance,
+  getLiveInstances,
   getLiveInstanceConfig,
   getInstanceConfig,
   getInstanceDetails,


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

Reply via email to