Skip to content

Add archive and activity indexes on tasks#312

Merged
simonsmallchua merged 7 commits into
mainfrom
optimise/db-archive-and-stuck-job-indexes
Apr 9, 2026
Merged

Add archive and activity indexes on tasks#312
simonsmallchua merged 7 commits into
mainfrom
optimise/db-archive-and-stuck-job-indexes

Conversation

@simonsmallchua
Copy link
Copy Markdown
Contributor

@simonsmallchua simonsmallchua commented Apr 8, 2026

Summary

Reduces Supabase CPU load identified in load testing (98% at 65 concurrent jobs) via three indexes and a lock-hold reduction in `EnqueueURLs`.


1. Three indexes on `tasks` (migration)

`idx_tasks_job_has_html_storage` (partial, `WHERE html_storage_path IS NOT NULL`)

  • Eliminates heap scan in the `NOT EXISTS` subquery of `MarkFullyArchivedJobs` (avg 28,537ms / max 118,279ms)

`idx_tasks_job_html_archived` (partial, `WHERE html_archived_at IS NOT NULL`)

  • Covers the `EXISTS` subquery in the same function; planner short-circuits on first match per job

`idx_tasks_job_activity_times` (compound `job_id, started_at DESC, completed_at DESC`)

  • Covers the correlated `MAX(GREATEST(started_at, completed_at))` subquery in `CleanupStuckJobs` (runs every minute across all running jobs)

2. Traffic score update moved outside the job-row lock (`EnqueueURLs`)

Problem: The `FOR UPDATE OF j` lock in `EnqueueURLs` was held while running a `page_analytics` JOIN to apply traffic scores. With 10 concurrent workers per job all calling `EnqueueURLs`, they queue behind each other waiting for this lock — the 1,228ms average is almost entirely lock wait time, not query time.

Fix: Traffic score `UPDATE` now runs in a separate `Execute` call after the first transaction commits and the job lock is released. Other workers for the same job can proceed immediately after the INSERT.

Added threshold: For `sourceType == "link"` (link-discovered pages), traffic scores are only applied if the source page priority is ≥ 0.729 (≈ 0.9³, meaning ~3 link-hops from the homepage). Pages deeper than this are too numerous and their relative ordering matters less to crawl efficiency. Sitemap and other source types always qualify.


What was skipped and why

  • `promote_waiting_task_for_job` — `idx_tasks_waiting_by_job` already covers the query; slow avg is lock contention under 65-job load, not a missing index
  • Compute tier upgrade — deferred until a load test validates these changes

Test plan

  • `go build ./internal/db/...` passes
  • `go test ./internal/db/...` passes
  • Run `supabase db reset` locally, verify indexes created without error
  • Load test at ~65 concurrent jobs and compare Supabase CPU vs. previous run
  • Confirm `MarkFullyArchivedJobs` and `EnqueueURLs` query times reduce in pg_stat_statements

Summary by CodeRabbit

  • Performance

    • Added targeted database indexes and moved task-counter updates to batched statement-level processing to speed background maintenance and reduce task-processing latency.
    • Batch promotion of waiting tasks now promotes multiple tasks per freed slot to improve throughput.
  • Chores

    • Moved traffic-score updates to run after commits and apply selectively for low-priority/deeply-discovered pages; failures are non-fatal to reduce lock contention and improve stability.

@supabase
Copy link
Copy Markdown

supabase Bot commented Apr 8, 2026

Updates to Preview Branch (optimise/db-archive-and-stuck-job-indexes) ↗︎

Deployments Status Updated
Database Thu, 09 Apr 2026 08:56:44 UTC
Services Thu, 09 Apr 2026 08:56:44 UTC
APIs Thu, 09 Apr 2026 08:56:44 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations Thu, 09 Apr 2026 08:56:45 UTC
Migrations Thu, 09 Apr 2026 08:56:47 UTC
Seeding Thu, 09 Apr 2026 08:56:49 UTC
Edge Functions Thu, 09 Apr 2026 08:56:49 UTC

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 8, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds three partial indexes on public.tasks, consolidates per-row INSERT triggers into a statement-level batched updater, moves page-analytics traffic-score updates out of the job-row lock into a conditional post-commit transaction, and replaces single-task promotion with a batch promotion function and callers.

Changes

Cohort / File(s) Summary
Database Indexes
supabase/migrations/20260408231218_add_archive_and_activity_indexes.sql
Adds three IF NOT EXISTS partial/covering indexes on public.tasks: idx_tasks_job_has_html_storage (WHERE html_storage_path IS NOT NULL), idx_tasks_job_html_archived (WHERE html_archived_at IS NOT NULL), and idx_tasks_job_activity_times (composite on job_id, started_at DESC NULLS LAST, completed_at DESC NULLS LAST).
Batched INSERT trigger
supabase/migrations/20260409025105_merge_insert_trigger_to_statement_level.sql
Introduces update_job_counters_insert_batch() as AFTER INSERT FOR EACH STATEMENT to aggregate inserted rows by job_id and perform single UPDATE jobs per job; strips INSERT handling from update_job_counters() and update_job_queue_counters() and replaces the row-level trigger with a statement-level trigger.
Queue logic / Transactions
internal/db/queue.go, internal/db/batch.go
Moves enqueueJobConfig declaration out of inner transaction; replaces COUNT(*) under job lock with j.total_tasks - j.skipped_tasks; removes in-transaction page_analytics UPDATE and runs it in a conditional post-commit transaction (only when org/domain valid and either non-link source or at least one page with Priority >= 0.729); keeps failures non-fatal. Removes in-transaction per-job single-task promotions from batch flush; uses batch promotion caller instead.
Batch promotion DB function
supabase/migrations/20260409064200_promote_waiting_tasks_batch.sql
Adds/replaces promote_waiting_tasks_for_job(p_job_id TEXT, p_slots INTEGER) to promote up to p_slots waiting tasks in one call using FOR UPDATE SKIP LOCKED and return promoted count; returns 0 when p_slots <= 0.
Changelog
CHANGELOG.md
Documents performance changes: partial indexes, statement-level INSERT trigger, enqueue transaction rework, priority gating for traffic-score updates, and multi-task promotion behavior.

Sequence Diagram(s)

sequenceDiagram
  participant Caller as Caller
  participant Queue as DbQueue
  participant DB as Database
  participant Log as Logger

  Caller->>Queue: EnqueueURLs(request)
  Queue->>DB: BEGIN (acquire job lock)
  Queue->>DB: INSERT/UPDATE tasks, update job counters (use total_tasks - skipped_tasks)
  DB-->>Queue: COMMIT (release job lock)
  Queue->>Queue: evaluate cfg, sourceType, page priorities
  alt cfg valid and gating satisfied
    Queue->>DB: BEGIN post-commit transaction
    Queue->>DB: UPDATE tasks FROM page_analytics (apply traffic scores)
    DB-->>Queue: COMMIT / rows affected
  else gating not met
    Queue->>Log: skip traffic-score update
  end
  alt update error
    Queue->>Log: log non-fatal warning
  end
  Queue->>DB: call promote_waiting_tasks_for_job(job_id, freed_slots)
  DB-->>Queue: return promoted_count
  Queue-->>Caller: return success
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add archive and activity indexes on tasks' accurately describes the primary change—three new conditional indexes on the tasks table to optimise query performance for archive and activity operations.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

Release Versions

App patch: v0.31.11v0.31.12

Changelog

Performance

  • Add three partial/covering indexes on tasks to reduce Supabase CPU load
    under high concurrency: idx_tasks_job_has_html_storage and
    idx_tasks_job_html_archived eliminate heap scans in MarkFullyArchivedJobs
    EXISTS/NOT EXISTS subqueries; idx_tasks_job_activity_times covers the
    per-job MAX timestamp scan in CleanupStuckJobs
  • Move traffic score UPDATE in EnqueueURLs to a separate transaction after the
    job-row lock is released, reducing lock hold time for concurrent workers on
    the same job
  • Skip traffic score updates for link-discovered pages deeper than ~3 hops from
    the homepage (priority < 0.729) — these pages are too numerous for the
    page_analytics join to be worthwhile; sitemap sources always apply
  • Merge two row-level INSERT triggers (update_job_counters,
    update_job_queue_counters) into a single statement-level trigger; a 500-row
    batch now emits one UPDATE jobs instead of 1,000, eliminating the dominant
    source of lock contention during EnqueueURLs
  • Replace correlated COUNT(*) WHERE status != 'skipped' subquery in
    EnqueueURLs with total_tasks - skipped_tasks (now maintained incrementally
    by the statement-level trigger), removing a per-call table scan from inside
    the job-row lock
  • Fix promote_waiting_task_for_job to promote N tasks per slot release instead
    of always 1; replace the stale running_tasks capacity join with a
    caller-supplied count; remove the redundant promotion loop from the batch
    flush transaction (ran under stale data and caused lock contention inside an
    already long-held lock)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 8, 2026

Codecov Report

❌ Patch coverage is 0% with 39 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
internal/db/queue.go 0.00% 39 Missing ⚠️

📢 Thoughts on this report? Let us know!

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/db/queue.go`:
- Around line 1547-1578: The UPDATE currently scopes by job_id only and can
affect unrelated tasks; instead build an eligiblePageIDs slice from the same
filtered pages used for enqueueing (the variable pages), and when sourceType ==
"link" include only pages with Priority >= minPriorityForTrafficScore; then call
q.Execute (the same block around tx.ExecContext) but pass eligiblePageIDs as an
additional parameter and change the SQL WHERE to restrict to those page IDs
(e.g. AND p.id = ANY($4)) so only pages from this enqueue batch get their
priority_score updated; keep using cfg.orgID, cfg.domainID and jobID as before
and only run the update when eligiblePageIDs is non-empty.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e3bdd8db-c358-4889-9e94-e78233af6ec7

📥 Commits

Reviewing files that changed from the base of the PR and between 61af2df and 0cabcc3.

📒 Files selected for processing (1)
  • internal/db/queue.go

Comment thread internal/db/queue.go
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
internal/db/queue.go (1)

1549-1573: ⚠️ Potential issue | 🟠 Major

Scope the post-commit traffic-score UPDATE to this enqueue batch.

Once any page in pages crosses the threshold, this query re-scores every pending/waiting task for job_id, including older deep-link tasks and even no-op enqueues. That leaks the new gate across batches and can reorder unrelated work.

Suggested fix
-	if cfg.orgID.Valid && cfg.domainID.Valid {
+	if cfg.orgID.Valid && cfg.domainID.Valid && len(eligiblePageIDs) > 0 {
 		eligible := sourceType != "link"
 		if !eligible {
 			for _, p := range pages {
 				if p.Priority >= minPriorityForTrafficScore {
 					eligible = true
 					break
 				}
 			}
 		}
 		if eligible {
 			if err2 := q.Execute(ctx, func(tx *sql.Tx) error {
 				_, err := tx.ExecContext(ctx, `
 					UPDATE tasks t
 					SET priority_score = GREATEST(t.priority_score, COALESCE(pa.traffic_score, 0))
 					FROM pages p
 					JOIN page_analytics pa ON pa.organisation_id = $1
 						AND pa.domain_id = $2
 						AND pa.path = p.path
 					WHERE t.page_id = p.id
 					AND t.job_id = $3
+					AND t.page_id = ANY($4)
 					AND t.status IN ('pending', 'waiting')
 					AND COALESCE(pa.traffic_score, 0) > t.priority_score
-				`, cfg.orgID.String, cfg.domainID.Int64, jobID)
+				`, cfg.orgID.String, cfg.domainID.Int64, jobID, pq.Array(eligiblePageIDs))
 				return err
 			}); err2 != nil {

Build eligiblePageIDs from the pages that actually survived enqueueing, and for sourceType == "link" keep only those that meet the threshold.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/db/queue.go` around lines 1549 - 1573, The UPDATE that writes
COALESCE(pa.traffic_score,0) to tasks currently runs for the whole job when any
page crosses the threshold; instead, compute eligiblePageIDs from the pages that
actually survived enqueueing (use the same post-enqueue filter used elsewhere),
and if sourceType == "link" further restrict eligiblePageIDs to those with
Priority >= minPriorityForTrafficScore, then call q.Execute/q.Tx to run the
UPDATE using WHERE t.job_id = jobID AND t.page_id = ANY($4) (or an IN list) and
only when eligiblePageIDs is non-empty so you only re-score tasks belonging to
the newly enqueued pages; reference cfg.orgID, cfg.domainID, sourceType, pages,
minPriorityForTrafficScore, q.Execute, and jobID when locating the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@supabase/migrations/20260409025105_merge_insert_trigger_to_statement_level.sql`:
- Around line 51-56: Remove INSERT from the row-level trigger by adding a
migration that drops and recreates trg_update_job_queue_counters so it only
fires on UPDATE or DELETE; specifically, DROP TRIGGER IF EXISTS
trg_update_job_queue_counters ON public.tasks and then CREATE TRIGGER
trg_update_job_queue_counters AFTER UPDATE OR DELETE ON public.tasks FOR EACH
ROW EXECUTE FUNCTION update_job_queue_counters(); this ensures
update_job_queue_counters() is not invoked per-row on INSERT and completes the
switch to statement-level inserts handled by
update_job_counters_insert_batch()/trg_job_counters_insert.

---

Duplicate comments:
In `@internal/db/queue.go`:
- Around line 1549-1573: The UPDATE that writes COALESCE(pa.traffic_score,0) to
tasks currently runs for the whole job when any page crosses the threshold;
instead, compute eligiblePageIDs from the pages that actually survived
enqueueing (use the same post-enqueue filter used elsewhere), and if sourceType
== "link" further restrict eligiblePageIDs to those with Priority >=
minPriorityForTrafficScore, then call q.Execute/q.Tx to run the UPDATE using
WHERE t.job_id = jobID AND t.page_id = ANY($4) (or an IN list) and only when
eligiblePageIDs is non-empty so you only re-score tasks belonging to the newly
enqueued pages; reference cfg.orgID, cfg.domainID, sourceType, pages,
minPriorityForTrafficScore, q.Execute, and jobID when locating the change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 20a33fa1-ec1b-49ab-b2e9-5938b6173961

📥 Commits

Reviewing files that changed from the base of the PR and between c20aae1 and 560a258.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • internal/db/queue.go
  • supabase/migrations/20260409025105_merge_insert_trigger_to_statement_level.sql

Comment on lines +51 to +56
DROP TRIGGER IF EXISTS trg_job_counters_insert ON public.tasks;
CREATE TRIGGER trg_job_counters_insert
AFTER INSERT ON public.tasks
REFERENCING NEW TABLE AS new_tasks
FOR EACH STATEMENT
EXECUTE FUNCTION update_job_counters_insert_batch();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C3 'trg_job_queue_counters|EXECUTE FUNCTION update_job_queue_counters|CREATE TRIGGER' supabase/migrations

Repository: Harvey-AU/hover

Length of output: 15048


🏁 Script executed:

cat -n supabase/migrations/20260409025105_merge_insert_trigger_to_statement_level.sql

Repository: Harvey-AU/hover

Length of output: 9945


Finish the trigger split by removing INSERT from the existing row-level trigger.

update_job_queue_counters() now returns early on INSERT, but its trigger (trg_update_job_queue_counters) still listens to INSERT events. This means every task insert still fires a row-level trigger invocation that immediately returns, creating avoidable hot-path overhead and leaving the statement-level optimisation incomplete.

Add a migration to drop and recreate trg_update_job_queue_counters with AFTER UPDATE OR DELETE only (removing INSERT), so batched inserts no longer trigger the row-level function unnecessarily.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@supabase/migrations/20260409025105_merge_insert_trigger_to_statement_level.sql`
around lines 51 - 56, Remove INSERT from the row-level trigger by adding a
migration that drops and recreates trg_update_job_queue_counters so it only
fires on UPDATE or DELETE; specifically, DROP TRIGGER IF EXISTS
trg_update_job_queue_counters ON public.tasks and then CREATE TRIGGER
trg_update_job_queue_counters AFTER UPDATE OR DELETE ON public.tasks FOR EACH
ROW EXECUTE FUNCTION update_job_queue_counters(); this ensures
update_job_queue_counters() is not invoked per-row on INSERT and completes the
switch to statement-level inserts handled by
update_job_counters_insert_batch()/trg_job_counters_insert.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
internal/db/queue.go (1)

1543-1579: ⚠️ Potential issue | 🟠 Major

Scope the post-commit traffic-score update to the current eligible pages.

Once a single eligible link page is present, this query still updates every pending/waiting task for the job. That re-scores older deep-link tasks that were meant to stay on structural ordering only, and even a no-op enqueue can rewrite unrelated rows. Restrict the UPDATE to page IDs from this enqueue batch that actually met the eligibility rule.

Patch idea
+	eligiblePageIDs := make([]int, 0, len(pageIDs))
+	for i, pageID := range pageIDs {
+		if sourceType != "link" || priorities[i] >= minPriorityForTrafficScore {
+			eligiblePageIDs = append(eligiblePageIDs, pageID)
+		}
+	}
-	eligible := sourceType != "link"
-	if !eligible {
-		for _, p := range pages {
-			if p.Priority >= minPriorityForTrafficScore {
-				eligible = true
-				break
-			}
-		}
-	}
-	if eligible {
+	if len(eligiblePageIDs) > 0 {
 		if err2 := q.Execute(ctx, func(tx *sql.Tx) error {
 			_, err := tx.ExecContext(ctx, `
 				UPDATE tasks t
 				SET priority_score = GREATEST(t.priority_score, COALESCE(pa.traffic_score, 0))
 				FROM pages p
 				JOIN page_analytics pa ON pa.organisation_id = $1
 					AND pa.domain_id = $2
 					AND pa.path = p.path
 				WHERE t.page_id = p.id
 				AND t.job_id = $3
+				AND t.page_id = ANY($4)
 				AND t.status IN ('pending', 'waiting')
 				AND COALESCE(pa.traffic_score, 0) > t.priority_score
-			`, cfg.orgID.String, cfg.domainID.Int64, jobID)
+			`, cfg.orgID.String, cfg.domainID.Int64, jobID, pq.Array(eligiblePageIDs))
 			return err
 		}); err2 != nil {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/db/queue.go` around lines 1543 - 1579, The UPDATE currently applies
traffic scores to all pending/waiting tasks for the job; collect the IDs of
pages from this enqueue batch that met the eligibility check (i.e., for
sourceType "link" only include pages with p.Priority >=
minPriorityForTrafficScore, otherwise include all page IDs), and pass that slice
into the post-commit q.Execute call (use jobID, cfg.orgID/cfg.domainID as
before) and restrict the UPDATE to only those page IDs (e.g., add AND t.page_id
= ANY($4) or JOIN on pages p WHERE p.id = ANY($4)), so only tasks for the
current eligible pages are updated. Ensure the new parameter uses the same
sql.ExecContext invocation that contains the UPDATE and adjust arguments
accordingly in the q.Execute closure.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@internal/db/queue.go`:
- Around line 1543-1579: The UPDATE currently applies traffic scores to all
pending/waiting tasks for the job; collect the IDs of pages from this enqueue
batch that met the eligibility check (i.e., for sourceType "link" only include
pages with p.Priority >= minPriorityForTrafficScore, otherwise include all page
IDs), and pass that slice into the post-commit q.Execute call (use jobID,
cfg.orgID/cfg.domainID as before) and restrict the UPDATE to only those page IDs
(e.g., add AND t.page_id = ANY($4) or JOIN on pages p WHERE p.id = ANY($4)), so
only tasks for the current eligible pages are updated. Ensure the new parameter
uses the same sql.ExecContext invocation that contains the UPDATE and adjust
arguments accordingly in the q.Execute closure.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 02690264-2135-46fc-af27-e25d9e3fdf7b

📥 Commits

Reviewing files that changed from the base of the PR and between 560a258 and 5afdfa4.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • internal/db/batch.go
  • internal/db/queue.go
  • supabase/migrations/20260409064200_promote_waiting_tasks_batch.sql

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-312.fly.dev
Dashboard: https://hover-pr-312.fly.dev/dashboard

@simonsmallchua simonsmallchua merged commit 3dfc530 into main Apr 9, 2026
11 checks passed
@simonsmallchua simonsmallchua deleted the optimise/db-archive-and-stuck-job-indexes branch April 9, 2026 08:59
@coderabbitai coderabbitai Bot mentioned this pull request Apr 9, 2026
4 tasks
simonsmallchua added a commit that referenced this pull request Apr 9, 2026
…job-indexes

Add archive and activity indexes on tasks
@coderabbitai coderabbitai Bot mentioned this pull request Apr 19, 2026
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant