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

xiangfu 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 436beaae47c Controller UI: Fix subtask filter crash; add Minion Task 
page status filters (#16591)
436beaae47c is described below

commit 436beaae47c581f8fa0245c61a8dff1419ae3299
Author: Xiang Fu <[email protected]>
AuthorDate: Wed Aug 13 16:19:12 2025 -0700

    Controller UI: Fix subtask filter crash; add Minion Task page status 
filters (#16591)
    
    * Controller UI: Fix subtask filter crash on Minion Task page by 
normalizing status and handling non-string values
    
    * Controller UI: Update Minion Task page filter to include NOT_STARTED, 
IN_PROGRESS, STOPPED, STOPPING, FAILED, COMPLETED, ABORTED, TIMED_OUT, 
TIMING_OUT, FAILING; normalize comparisons
    
    * Address PR feedback: cache uppercased status before normalization in 
filters
---
 .../resources/app/components/TaskStatusFilter.tsx  | 32 +++++++++++++++++++++-
 .../resources/app/components/useTaskListing.tsx    | 26 +++++++++++-------
 .../src/main/resources/app/pages/TaskDetail.tsx    | 11 +++++---
 3 files changed, 54 insertions(+), 15 deletions(-)

diff --git 
a/pinot-controller/src/main/resources/app/components/TaskStatusFilter.tsx 
b/pinot-controller/src/main/resources/app/components/TaskStatusFilter.tsx
index 039952a5fa5..821c643667c 100644
--- a/pinot-controller/src/main/resources/app/components/TaskStatusFilter.tsx
+++ b/pinot-controller/src/main/resources/app/components/TaskStatusFilter.tsx
@@ -100,7 +100,23 @@ const useStyles = makeStyles((theme) => ({
   },
 }));
 
-export type TaskStatus = 'COMPLETED' | 'RUNNING' | 'WAITING' | 'ERROR' | 
'UNKNOWN' | 'DROPPED' | 'TIMED_OUT' | 'ABORTED';
+export type TaskStatus =
+  | 'COMPLETED'
+  | 'RUNNING'
+  | 'WAITING'
+  | 'ERROR'
+  | 'UNKNOWN'
+  | 'DROPPED'
+  | 'TIMED_OUT'
+  | 'ABORTED'
+  // Additional task-level statuses for Minion task page
+  | 'NOT_STARTED'
+  | 'IN_PROGRESS'
+  | 'STOPPED'
+  | 'STOPPING'
+  | 'FAILED'
+  | 'TIMING_OUT'
+  | 'FAILING';
 
 type TaskStatusFilterOption = {
   label: string;
@@ -125,6 +141,8 @@ export const getTaskStatusChipClass = (status: string, 
classes?: any) => {
       return classes.waiting;
     case 'ERROR':
       return classes.error;
+    case 'FAILED':
+      return classes.error;
     case 'UNKNOWN':
       return classes.unknown;
     case 'DROPPED':
@@ -132,8 +150,20 @@ export const getTaskStatusChipClass = (status: string, 
classes?: any) => {
     case 'TIMED_OUT':
     case 'TIMEDOUT':
       return classes.timedout;
+    case 'TIMING_OUT':
+      return classes.timedout;
     case 'ABORTED':
       return classes.aborted;
+    case 'NOT_STARTED':
+      return classes.unknown;
+    case 'IN_PROGRESS':
+      return classes.running;
+    case 'STOPPING':
+      return classes.waiting;
+    case 'STOPPED':
+      return classes.aborted;
+    case 'FAILING':
+      return classes.error;
     default:
       return '';
   }
diff --git 
a/pinot-controller/src/main/resources/app/components/useTaskListing.tsx 
b/pinot-controller/src/main/resources/app/components/useTaskListing.tsx
index 4eaad35e2a9..77c5db46c85 100644
--- a/pinot-controller/src/main/resources/app/components/useTaskListing.tsx
+++ b/pinot-controller/src/main/resources/app/components/useTaskListing.tsx
@@ -49,25 +49,31 @@ export default function useTaskListing(props) {
     }
 
     const filtered = tasks.records.filter(([_, status]) => {
-      const taskStatus = typeof status === 'object' && status !== null && 
'value' in status
-        ? status.value as string
-        : status as string;
-      return taskStatus.toUpperCase() === statusFilter;
+      const rawStatus = (typeof status === 'object' && status !== null && 
'value' in status)
+        ? (status as { value?: unknown }).value
+        : status;
+      const statusString = typeof rawStatus === 'string' ? rawStatus : '';
+      const upperStatus = statusString.toUpperCase();
+      const normalized = upperStatus === 'TIMEDOUT' ? 'TIMED_OUT' : 
upperStatus;
+      return normalized === statusFilter;
     });
 
     return { ...tasks, records: filtered };
   }, [tasks, statusFilter]);
 
+  // Minion task page statuses
   const statusFilterOptions = [
     { label: 'All', value: 'ALL' as const },
+    { label: 'Not Started', value: 'NOT_STARTED' as const },
+    { label: 'In Progress', value: 'IN_PROGRESS' as const },
+    { label: 'Stopped', value: 'STOPPED' as const },
+    { label: 'Stopping', value: 'STOPPING' as const },
+    { label: 'Failed', value: 'FAILED' as const },
     { label: 'Completed', value: 'COMPLETED' as const },
-    { label: 'Running', value: 'RUNNING' as const },
-    { label: 'Waiting', value: 'WAITING' as const },
-    { label: 'Error', value: 'ERROR' as const },
-    { label: 'Unknown', value: 'UNKNOWN' as const },
-    { label: 'Dropped', value: 'DROPPED' as const },
-    { label: 'Timed Out', value: 'TIMED_OUT' as const },
     { label: 'Aborted', value: 'ABORTED' as const },
+    { label: 'Timed Out', value: 'TIMED_OUT' as const },
+    { label: 'Timing Out', value: 'TIMING_OUT' as const },
+    { label: 'Failing', value: 'FAILING' as const },
   ];
 
   const statusFilterElement = (
diff --git a/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx 
b/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
index 3d779e49b3f..1ad5278d1ed 100644
--- a/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
+++ b/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
@@ -115,10 +115,13 @@ const TaskDetail = (props) => {
     }
 
     const filtered = subtaskTableData.records.filter(([_, status]) => {
-      const subtaskStatus = typeof status === 'object' && status !== null && 
'value' in status
-        ? status.value as string
-        : status as string;
-      return subtaskStatus.toUpperCase() === subtaskStatusFilter;
+      const rawStatus = (typeof status === 'object' && status !== null && 
'value' in status)
+        ? (status as { value?: unknown }).value
+        : status;
+      const statusString = typeof rawStatus === 'string' ? rawStatus : '';
+      const statusUpper = statusString.toUpperCase();
+      const normalized = statusUpper === 'TIMEDOUT' ? 'TIMED_OUT' : 
statusUpper;
+      return normalized === subtaskStatusFilter;
     });
 
     return { ...subtaskTableData, records: filtered };


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to