Files
supabase/apps/studio/hooks/misc/useCronJobsEstimatePrefetch.ts
T
Charis d34cc65e30 fix(studio): handle large cron.job_run_details table gracefully (#41992)
* fix(studio): check job_run_details size in cron display

When cron.job_run_details grows too large (200k+ rows), loading the
cron jobs overview can timeout and affect other queries by pulling
excessive data into shared buffers.

This change:
- Estimates table size using pg_stat before fetching cron jobs data
- Shows a cleanup notice when the table exceeds the threshold
- Provides batched deletion using ctid ranges to avoid buffer pollution
- Allows scheduling an automated daily cleanup cron job
- Handles timeout errors gracefully with a "suspected overflow" state

The useCronJobsData hook now returns a discriminated union status that
tracks loading, estimate-error, overflow-confirmed, overflow-suspected,
and ready states, allowing the UI to respond appropriately to each case.

* fix(studio): use index when querying cron.job_run_details

cron.job_run_details is only indexed by runid, not by start_time. Change
the query to use the runid index (which gives the same result, since
runid is auto-incrementing).
2026-01-22 11:17:49 -05:00

30 lines
1.1 KiB
TypeScript

import { useQueryClient } from '@tanstack/react-query'
import { useEffect } from 'react'
import { prefetchCronJobRunDetailsEstimate } from 'data/database-cron-jobs/database-cron-job-run-details-estimate-query'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { useStaticEffectEvent } from 'hooks/useStaticEffectEvent'
/**
* Prefetches the cron job run details estimate when on a Cron integration page.
* This avoids a query waterfall when navigating to the Jobs tab, since the
* Jobs tab gates loading cron jobs on this estimate query completing first.
*/
export function useCronJobsEstimatePrefetch(integrationId: string | undefined) {
const queryClient = useQueryClient()
const { data: project } = useSelectedProjectQuery()
const prefetch = useStaticEffectEvent(() => {
prefetchCronJobRunDetailsEstimate(queryClient, {
projectRef: project?.ref,
connectionString: project?.connectionString,
})
})
useEffect(() => {
if (integrationId === 'cron' && project?.ref) {
prefetch()
}
}, [integrationId, project?.ref, prefetch])
}