From 78c115c68c33d6c5803e008dcd6727bd8edd67ca Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 31 Jul 2024 12:59:15 +0200 Subject: [PATCH] fix: improve index usage and runs page performance --- ...70c905e689f37c6d931ee4559c3cfd394e168.json | 23 ------ ...cdde047d0f0c172c7a01eeabe3bd8206a3069.json | 14 ++++ ...cf90df758e85a8cac6037d044d5bd7440681.json} | 8 +- ...212ccb5b08c84fc75f9efe22d86842cd618c5.json | 12 --- ...a9e24561dfaa6b07ce89063d0910d2342a83b.json | 30 -------- ...20240731093818_remove_foreign_key.down.sql | 1 + .../20240731093818_remove_foreign_key.up.sql | 3 + backend/windmill-api/src/db.rs | 77 +++++++++++++++++-- .../src/lib/components/runs/JobLoader.svelte | 1 + 9 files changed, 93 insertions(+), 76 deletions(-) delete mode 100644 backend/.sqlx/query-061ff848f258dc880bec81d923370c905e689f37c6d931ee4559c3cfd394e168.json create mode 100644 backend/.sqlx/query-15105be6247457fc01b7d65767ccdde047d0f0c172c7a01eeabe3bd8206a3069.json rename backend/.sqlx/{query-45587eb1ea7b6e695327ab7dfbd13c96e7415d16f5fe7d92c308020696e3dd7f.json => query-51a7e36ba1cc1616a19485eb5930cf90df758e85a8cac6037d044d5bd7440681.json} (68%) delete mode 100644 backend/.sqlx/query-87a38cdaec0e143ec3250cd9d68212ccb5b08c84fc75f9efe22d86842cd618c5.json delete mode 100644 backend/.sqlx/query-c8ac658002423906f2a6e43e423a9e24561dfaa6b07ce89063d0910d2342a83b.json create mode 100644 backend/migrations/20240731093818_remove_foreign_key.down.sql create mode 100644 backend/migrations/20240731093818_remove_foreign_key.up.sql diff --git a/backend/.sqlx/query-061ff848f258dc880bec81d923370c905e689f37c6d931ee4559c3cfd394e168.json b/backend/.sqlx/query-061ff848f258dc880bec81d923370c905e689f37c6d931ee4559c3cfd394e168.json deleted file mode 100644 index b765d8bfdd..0000000000 --- a/backend/.sqlx/query-061ff848f258dc880bec81d923370c905e689f37c6d931ee4559c3cfd394e168.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT flow_status FROM completed_job WHERE id = $1 AND workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "flow_status", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "061ff848f258dc880bec81d923370c905e689f37c6d931ee4559c3cfd394e168" -} diff --git a/backend/.sqlx/query-15105be6247457fc01b7d65767ccdde047d0f0c172c7a01eeabe3bd8206a3069.json b/backend/.sqlx/query-15105be6247457fc01b7d65767ccdde047d0f0c172c7a01eeabe3bd8206a3069.json new file mode 100644 index 0000000000..543f8c634c --- /dev/null +++ b/backend/.sqlx/query-15105be6247457fc01b7d65767ccdde047d0f0c172c7a01eeabe3bd8206a3069.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO windmill_migrations (name) VALUES ($1) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "15105be6247457fc01b7d65767ccdde047d0f0c172c7a01eeabe3bd8206a3069" +} diff --git a/backend/.sqlx/query-45587eb1ea7b6e695327ab7dfbd13c96e7415d16f5fe7d92c308020696e3dd7f.json b/backend/.sqlx/query-51a7e36ba1cc1616a19485eb5930cf90df758e85a8cac6037d044d5bd7440681.json similarity index 68% rename from backend/.sqlx/query-45587eb1ea7b6e695327ab7dfbd13c96e7415d16f5fe7d92c308020696e3dd7f.json rename to backend/.sqlx/query-51a7e36ba1cc1616a19485eb5930cf90df758e85a8cac6037d044d5bd7440681.json index d54519c1af..d2775c1c94 100644 --- a/backend/.sqlx/query-45587eb1ea7b6e695327ab7dfbd13c96e7415d16f5fe7d92c308020696e3dd7f.json +++ b/backend/.sqlx/query-51a7e36ba1cc1616a19485eb5930cf90df758e85a8cac6037d044d5bd7440681.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = 'fix_job_completed_index_2')", + "query": "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = $1)", "describe": { "columns": [ { @@ -10,11 +10,13 @@ } ], "parameters": { - "Left": [] + "Left": [ + "Text" + ] }, "nullable": [ null ] }, - "hash": "45587eb1ea7b6e695327ab7dfbd13c96e7415d16f5fe7d92c308020696e3dd7f" + "hash": "51a7e36ba1cc1616a19485eb5930cf90df758e85a8cac6037d044d5bd7440681" } diff --git a/backend/.sqlx/query-87a38cdaec0e143ec3250cd9d68212ccb5b08c84fc75f9efe22d86842cd618c5.json b/backend/.sqlx/query-87a38cdaec0e143ec3250cd9d68212ccb5b08c84fc75f9efe22d86842cd618c5.json deleted file mode 100644 index 37c8a327ee..0000000000 --- a/backend/.sqlx/query-87a38cdaec0e143ec3250cd9d68212ccb5b08c84fc75f9efe22d86842cd618c5.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO windmill_migrations (name) VALUES ('fix_job_completed_index_2') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "87a38cdaec0e143ec3250cd9d68212ccb5b08c84fc75f9efe22d86842cd618c5" -} diff --git a/backend/.sqlx/query-c8ac658002423906f2a6e43e423a9e24561dfaa6b07ce89063d0910d2342a83b.json b/backend/.sqlx/query-c8ac658002423906f2a6e43e423a9e24561dfaa6b07ce89063d0910d2342a83b.json deleted file mode 100644 index 44fcf45d09..0000000000 --- a/backend/.sqlx/query-c8ac658002423906f2a6e43e423a9e24561dfaa6b07ce89063d0910d2342a83b.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT leaf_jobs->$1::text as leaf_jobs, parent_job FROM queue WHERE COALESCE((SELECT root_job FROM queue WHERE id = $2), $2) = id AND workspace_id = $3", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "leaf_jobs", - "type_info": "Jsonb" - }, - { - "ordinal": 1, - "name": "parent_job", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Text", - "Uuid", - "Text" - ] - }, - "nullable": [ - null, - true - ] - }, - "hash": "c8ac658002423906f2a6e43e423a9e24561dfaa6b07ce89063d0910d2342a83b" -} diff --git a/backend/migrations/20240731093818_remove_foreign_key.down.sql b/backend/migrations/20240731093818_remove_foreign_key.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20240731093818_remove_foreign_key.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20240731093818_remove_foreign_key.up.sql b/backend/migrations/20240731093818_remove_foreign_key.up.sql new file mode 100644 index 0000000000..efe47b2b78 --- /dev/null +++ b/backend/migrations/20240731093818_remove_foreign_key.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +alter table queue drop constraint if exists queue_workspace_id_fkey; +alter table completed_job drop constraint if exists completed_job_workspace_id_fkey; diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 8cacc5a6c1..3c7c949cca 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -290,14 +290,16 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { // tx.commit().await?; // } + let migration_job_name = "fix_job_completed_index_2"; let has_done_migration = sqlx::query_scalar!( - "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = 'fix_job_completed_index_2')" + "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = $1)", + migration_job_name ) .fetch_one(db) .await? .unwrap_or(false); if !has_done_migration { - tracing::info!("Applying fix_job_completed_index_2 migration"); + tracing::info!("Applying {migration_job_name} migration"); let mut tx = db.begin().await?; let mut r = false; while !r { @@ -305,12 +307,12 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { .fetch_one(&mut *tx) .await .map_err(|e| { - tracing::error!("Error acquiring fix_job_completed_index_2 lock: {e:#}"); + tracing::error!("Error acquiring {migration_job_name} lock: {e:#}"); sqlx::migrate::MigrateError::Execute(e) })? .unwrap_or(false); if !r { - tracing::info!("PG fix_job_completed_index_migration_2 lock already acquired by another server or worker, retrying in 5s. (look for the advisory lock in pg_lock with granted = true)"); + tracing::info!("PG {migration_job_name} lock already acquired by another server or worker, retrying in 5s. (look for the advisory lock in pg_lock with granted = true)"); tokio::time::sleep(std::time::Duration::from_secs(5)).await; } } @@ -332,14 +334,73 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { .execute(db) .await?; - sqlx::query!("INSERT INTO windmill_migrations (name) VALUES ('fix_job_completed_index_2') ON CONFLICT DO NOTHING") - .execute(&mut *tx) - .await?; + sqlx::query!( + "INSERT INTO windmill_migrations (name) VALUES ($1) ON CONFLICT DO NOTHING", + migration_job_name + ) + .execute(&mut *tx) + .await?; let _ = sqlx::query("SELECT pg_advisory_unlock(4242)") .execute(&mut *tx) .await?; tx.commit().await?; - tracing::info!("Finished applying fix_job_completed_index_2 migration"); + tracing::info!("Finished applying {migration_job_name} migration"); + } + + let migration_job_name = "fix_job_completed_index_3"; + let has_done_migration = sqlx::query_scalar!( + "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = $1)", + migration_job_name + ) + .fetch_one(db) + .await? + .unwrap_or(false); + if !has_done_migration { + tracing::info!("Applying {migration_job_name} migration"); + let mut tx = db.begin().await?; + let mut r = false; + while !r { + r = sqlx::query_scalar!("SELECT pg_try_advisory_lock(4242)") + .fetch_one(&mut *tx) + .await + .map_err(|e| { + tracing::error!("Error acquiring {migration_job_name} lock: {e:#}"); + sqlx::migrate::MigrateError::Execute(e) + })? + .unwrap_or(false); + if !r { + tracing::info!("PG {migration_job_name} lock already acquired by another server or worker, retrying in 5s. (look for the advisory lock in pg_lock with granted = true)"); + tokio::time::sleep(std::time::Duration::from_secs(5)).await; + } + } + + sqlx::query("DROP INDEX CONCURRENTLY IF EXISTS index_completed_job_on_schedule_path") + .execute(db) + .await?; + + sqlx::query("DROP INDEX CONCURRENTLY IF EXISTS concurrency_limit_stats_queue") + .execute(db) + .await?; + + sqlx::query("DROP INDEX CONCURRENTLY IF EXISTS root_job_index") + .execute(db) + .await?; + + sqlx::query("DROP INDEX CONCURRENTLY IF EXISTS index_completed_on_created") + .execute(db) + .await?; + + sqlx::query!( + "INSERT INTO windmill_migrations (name) VALUES ($1) ON CONFLICT DO NOTHING", + migration_job_name + ) + .execute(&mut *tx) + .await?; + let _ = sqlx::query("SELECT pg_advisory_unlock(4242)") + .execute(&mut *tx) + .await?; + tx.commit().await?; + tracing::info!("Finished applying {migration_job_name} migration"); } Ok(()) diff --git a/frontend/src/lib/components/runs/JobLoader.svelte b/frontend/src/lib/components/runs/JobLoader.svelte index 6cee6e0667..b3365c1959 100644 --- a/frontend/src/lib/components/runs/JobLoader.svelte +++ b/frontend/src/lib/components/runs/JobLoader.svelte @@ -130,6 +130,7 @@ running: success == 'running' ? true : undefined, isSkipped: isSkipped ? undefined : false, isFlowStep: jobKindsCat != 'all' ? false : undefined, + hasNullParent: jobKindsCat != 'all' ? false : undefined, label: label === null || label === '' ? undefined : label, isNotSchedule: showSchedules == false ? true : undefined, scheduledForBeforeNow: showFutureJobs == false ? true : undefined,