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]