From a877937a2561d0c0ce93ede2eb7444fd46a3b053 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 10:11:11 +0100 Subject: [PATCH 1/6] add missing downgarde index drop, add optimize after downgrades --- .../repository/migrations/sqlite3/08_add-footprint.down.sql | 2 ++ .../migrations/sqlite3/12_stats-covering-index.down.sql | 3 +++ 2 files changed, 5 insertions(+) diff --git a/internal/repository/migrations/sqlite3/08_add-footprint.down.sql b/internal/repository/migrations/sqlite3/08_add-footprint.down.sql index cc2d3e95..fefa54f6 100644 --- a/internal/repository/migrations/sqlite3/08_add-footprint.down.sql +++ b/internal/repository/migrations/sqlite3/08_add-footprint.down.sql @@ -101,3 +101,5 @@ DROP INDEX IF EXISTS jobs_numnodes_starttime; DROP INDEX IF EXISTS jobs_numhwthreads_starttime; DROP INDEX IF EXISTS jobs_numacc_starttime; DROP INDEX IF EXISTS jobs_energy_starttime; + +PRAGMA optimize; diff --git a/internal/repository/migrations/sqlite3/12_stats-covering-index.down.sql b/internal/repository/migrations/sqlite3/12_stats-covering-index.down.sql index 1368eb1f..0d5e3865 100644 --- a/internal/repository/migrations/sqlite3/12_stats-covering-index.down.sql +++ b/internal/repository/migrations/sqlite3/12_stats-covering-index.down.sql @@ -1 +1,4 @@ DROP INDEX IF EXISTS jobs_cluster_user_starttime_stats; +DROP INDEX IF EXISTS jobs_cluster_project_starttime_stats; + +PRAGMA optimize; From 41114f7eda3d12a808f6168b37768851a3d49413 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 10:48:38 +0100 Subject: [PATCH 2/6] reorder frontend coded filters to match db indices --- web/frontend/src/DashPublic.root.svelte | 2 +- web/frontend/src/Node.root.svelte | 2 +- web/frontend/src/status/DashInternal.svelte | 4 ++-- web/frontend/src/status/dashdetails/StatisticsDash.svelte | 2 +- web/frontend/src/status/dashdetails/StatusDash.svelte | 2 +- web/frontend/src/status/dashdetails/UsageDash.svelte | 4 ++-- web/frontend/src/systems/nodelist/NodeListRow.svelte | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web/frontend/src/DashPublic.root.svelte b/web/frontend/src/DashPublic.root.svelte index c9e0523c..4a26befb 100644 --- a/web/frontend/src/DashPublic.root.svelte +++ b/web/frontend/src/DashPublic.root.svelte @@ -185,7 +185,7 @@ from: from.toISOString(), clusterFrom: clusterFrom.toISOString(), to: to.toISOString(), - jobFilter: [{ state: ["running"] }, { cluster: { eq: presetCluster } }], + jobFilter: [{ cluster: { eq: presetCluster } }, { state: ["running"] }], nodeFilter: { cluster: { eq: presetCluster }}, paging: { itemsPerPage: -1, page: 1 }, // Get all: -1 sorting: { field: "startTime", type: "col", order: "DESC" } diff --git a/web/frontend/src/Node.root.svelte b/web/frontend/src/Node.root.svelte index db424a2f..a9ce8a74 100644 --- a/web/frontend/src/Node.root.svelte +++ b/web/frontend/src/Node.root.svelte @@ -119,8 +119,8 @@ const filter = $derived([ { cluster: { eq: cluster } }, - { node: { eq: hostname } }, { state: ["running"] }, + { node: { eq: hostname } }, ]); const systemUnits = $derived.by(() => { diff --git a/web/frontend/src/status/DashInternal.svelte b/web/frontend/src/status/DashInternal.svelte index 145ac4dc..d537e84e 100644 --- a/web/frontend/src/status/DashInternal.svelte +++ b/web/frontend/src/status/DashInternal.svelte @@ -190,7 +190,7 @@ from: from.toISOString(), to: to.toISOString(), clusterFrom: clusterFrom.toISOString(), - jobFilter: [{ state: ["running"] }, { cluster: { eq: presetCluster } }], + jobFilter: [{ cluster: { eq: presetCluster } }, { state: ["running"] }], paging: { itemsPerPage: -1, page: 1 }, // Get all: -1 sorting: { field: "startTime", type: "col", order: "DESC" } }, @@ -216,7 +216,7 @@ } `, variables: { - filter: [{ state: ["running"] }, { cluster: { eq: presetCluster} }], + filter: [{ cluster: { eq: presetCluster} }, { state: ["running"] }], paging: pagingState // Top 10 }, requestPolicy: "network-only" diff --git a/web/frontend/src/status/dashdetails/StatisticsDash.svelte b/web/frontend/src/status/dashdetails/StatisticsDash.svelte index d83adc15..6c0e17fc 100644 --- a/web/frontend/src/status/dashdetails/StatisticsDash.svelte +++ b/web/frontend/src/status/dashdetails/StatisticsDash.svelte @@ -72,7 +72,7 @@ } `, variables: { - filter: [{ state: ["running"] }, { cluster: { eq: cluster} }], + filter: [{ cluster: { eq: cluster} }, { state: ["running"] }], selectedHistograms: selectedHistograms }, requestPolicy: "network-only" diff --git a/web/frontend/src/status/dashdetails/StatusDash.svelte b/web/frontend/src/status/dashdetails/StatusDash.svelte index 0c2626d0..7bcbb017 100644 --- a/web/frontend/src/status/dashdetails/StatusDash.svelte +++ b/web/frontend/src/status/dashdetails/StatusDash.svelte @@ -179,7 +179,7 @@ metrics: ["flops_any", "mem_bw"], // Fixed names for roofline and status bars from: from.toISOString(), to: to.toISOString(), - jobFilter: [{ state: ["running"] }, { cluster: { eq: cluster } }], + jobFilter: [{ cluster: { eq: cluster } }, { state: ["running"] }], nodeFilter: { cluster: { eq: cluster }}, paging: { itemsPerPage: -1, page: 1 }, // Get all: -1 sorting: { field: "startTime", type: "col", order: "DESC" } diff --git a/web/frontend/src/status/dashdetails/UsageDash.svelte b/web/frontend/src/status/dashdetails/UsageDash.svelte index 2a9b3037..5b0e67fe 100644 --- a/web/frontend/src/status/dashdetails/UsageDash.svelte +++ b/web/frontend/src/status/dashdetails/UsageDash.svelte @@ -60,8 +60,8 @@ const canvasPrefix = $derived(`${presetCluster}-${presetSubCluster ? presetSubCluster : ''}`) const statusFilter = $derived(presetSubCluster - ? [{ state: ["running"] }, { cluster: { eq: presetCluster} }, { subCluster: { eq: presetSubCluster } }] - : [{ state: ["running"] }, { cluster: { eq: presetCluster} }] + ? [{ cluster: { eq: presetCluster} }, { subCluster: { eq: presetSubCluster } }, { state: ["running"] }] + : [{ cluster: { eq: presetCluster} }, { state: ["running"] }] ); const topJobsQuery = $derived(loadMe ? queryStore({ client: client, diff --git a/web/frontend/src/systems/nodelist/NodeListRow.svelte b/web/frontend/src/systems/nodelist/NodeListRow.svelte index 558d0642..62b6517b 100644 --- a/web/frontend/src/systems/nodelist/NodeListRow.svelte +++ b/web/frontend/src/systems/nodelist/NodeListRow.svelte @@ -63,8 +63,8 @@ /* Derived */ const filter = $derived([ { cluster: { eq: cluster } }, - { node: { contains: nodeData.host } }, { state: ["running"] }, + { node: { contains: nodeData.host } }, ]); const nodeJobsData = $derived(queryStore({ client: client, From c23d7bd5e53e04de62205012a823b364bd7043fb Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 11:27:45 +0100 Subject: [PATCH 3/6] remove non-required sorting params - caused expensive DB scans without use or need --- web/frontend/src/DashPublic.root.svelte | 1 - web/frontend/src/status/DashInternal.svelte | 1 - web/frontend/src/status/dashdetails/StatusDash.svelte | 1 - 3 files changed, 3 deletions(-) diff --git a/web/frontend/src/DashPublic.root.svelte b/web/frontend/src/DashPublic.root.svelte index 4a26befb..e824f881 100644 --- a/web/frontend/src/DashPublic.root.svelte +++ b/web/frontend/src/DashPublic.root.svelte @@ -149,7 +149,6 @@ jobsStatistics( filter: $jobFilter page: $paging - sortBy: TOTALJOBS groupBy: CLUSTER ) { id diff --git a/web/frontend/src/status/DashInternal.svelte b/web/frontend/src/status/DashInternal.svelte index d537e84e..35ba6e9b 100644 --- a/web/frontend/src/status/DashInternal.svelte +++ b/web/frontend/src/status/DashInternal.svelte @@ -155,7 +155,6 @@ jobsStatistics( filter: $jobFilter page: $paging - sortBy: TOTALJOBS groupBy: CLUSTER ) { id diff --git a/web/frontend/src/status/dashdetails/StatusDash.svelte b/web/frontend/src/status/dashdetails/StatusDash.svelte index 7bcbb017..228b1ae8 100644 --- a/web/frontend/src/status/dashdetails/StatusDash.svelte +++ b/web/frontend/src/status/dashdetails/StatusDash.svelte @@ -163,7 +163,6 @@ jobsStatistics( filter: $jobFilter page: $paging - sortBy: TOTALJOBS groupBy: SUBCLUSTER ) { id From 58c0c79f72be42bd6732d98f0cf9c046aa9407bf Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 12:03:06 +0100 Subject: [PATCH 4/6] handle single job state queries as simple stringquery - this will improve index usage for single state queries --- internal/repository/jobQuery.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/internal/repository/jobQuery.go b/internal/repository/jobQuery.go index 0c457ec2..534a8096 100644 --- a/internal/repository/jobQuery.go +++ b/internal/repository/jobQuery.go @@ -197,11 +197,17 @@ func BuildWhereClause(filter *model.JobFilter, query sq.SelectBuilder) sq.Select query = buildStringCondition("job.cluster_partition", filter.Partition, query) } if filter.State != nil { - states := make([]string, len(filter.State)) - for i, val := range filter.State { - states[i] = string(val) + if len(filter.State) == 1 { + singleStat := string(filter.State[0]) + singleStateQuery := model.StringInput{Eq: &singleStat} + query = buildStringCondition("job.job_state", &singleStateQuery, query) + } else { + states := make([]string, len(filter.State)) + for i, val := range filter.State { + states[i] = string(val) + } + query = query.Where(sq.Eq{"job.job_state": states}) } - query = query.Where(sq.Eq{"job.job_state": states}) } if filter.Shared != nil { query = query.Where("job.shared = ?", *filter.Shared) From c238f68af64eed7a646cc937afb02a7c223b9c6f Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 12:05:16 +0100 Subject: [PATCH 5/6] reduce unnecessary complexity --- internal/repository/jobQuery.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/repository/jobQuery.go b/internal/repository/jobQuery.go index 534a8096..65db52f6 100644 --- a/internal/repository/jobQuery.go +++ b/internal/repository/jobQuery.go @@ -199,8 +199,7 @@ func BuildWhereClause(filter *model.JobFilter, query sq.SelectBuilder) sq.Select if filter.State != nil { if len(filter.State) == 1 { singleStat := string(filter.State[0]) - singleStateQuery := model.StringInput{Eq: &singleStat} - query = buildStringCondition("job.job_state", &singleStateQuery, query) + query = query.Where("job.job_state = ?", &singleStat) } else { states := make([]string, len(filter.State)) for i, val := range filter.State { From e666980184c3837d375ad0e6f3dfd1741257aa9b Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Mar 2026 12:07:43 +0100 Subject: [PATCH 6/6] fix typo --- internal/repository/jobQuery.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/repository/jobQuery.go b/internal/repository/jobQuery.go index 65db52f6..445d91d3 100644 --- a/internal/repository/jobQuery.go +++ b/internal/repository/jobQuery.go @@ -199,7 +199,7 @@ func BuildWhereClause(filter *model.JobFilter, query sq.SelectBuilder) sq.Select if filter.State != nil { if len(filter.State) == 1 { singleStat := string(filter.State[0]) - query = query.Where("job.job_state = ?", &singleStat) + query = query.Where("job.job_state = ?", singleStat) } else { states := make([]string, len(filter.State)) for i, val := range filter.State {