From 029e2c7537778324e3ece5f8a3555e0f4bc153c8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 19:18:02 +0100 Subject: [PATCH 1/9] migration to remove unecessary triggers and fields after job v2 --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/db.rs | 176 +++++++++++++++++---------------- 2 files changed, 90 insertions(+), 88 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index fa0585b17f..c94a57b20f 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -841642097f07cc1f765ef74059d66aae2eba2c1d \ No newline at end of file +703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 9adae014d3..e768c5811d 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -225,27 +225,27 @@ pub async fn migrate(db: &DB) -> Result<(), Error> { } }); - // if !has_done_migration(db, "v2_finalize_disable_sync").await { - // let db2 = db.clone(); - // let _ = tokio::task::spawn(async move { - // loop { - // if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { - // tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); - // tokio::time::sleep(Duration::from_secs(5)).await; - // continue; - // } - // if let Err(err) = v2_finalize(&db2).await { - // tracing::error!( - // "{err:#}: Could not apply v2 finalize migration, retry in 30s.." - // ); - // tokio::time::sleep(Duration::from_secs(30)).await; - // continue; - // } - // tracing::info!("v2 finalization step successfully applied."); - // break; - // } - // }); - // } + if !has_done_migration(db, "v2_finalize_disable_sync_II").await { + let db2 = db.clone(); + let _ = tokio::task::spawn(async move { + loop { + if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { + tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); + tokio::time::sleep(Duration::from_secs(5)).await; + continue; + } + if let Err(err) = v2_finalize(&db2).await { + tracing::error!( + "{err:#}: Could not apply v2 finalize migration, retry in 30s.." + ); + tokio::time::sleep(Duration::from_secs(30)).await; + continue; + } + tracing::info!("v2 finalization step successfully applied."); + break; + } + }); + } Ok(()) } @@ -329,9 +329,12 @@ macro_rules! run_windmill_migration { 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)"); + drop($tx); tokio::time::sleep(std::time::Duration::from_secs(5)).await; + $tx = db.begin().await?; } } tracing::info!("acquired lock for {migration_job_name}"); @@ -367,21 +370,21 @@ macro_rules! run_windmill_migration { } async fn v2_finalize(db: &DB) -> Result<(), Error> { - run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { + run_windmill_migration!("v2_finalize_disable_sync_II", db, |tx| { tx.execute( r#" - DROP FUNCTION v2_job_after_update CASCADE; - DROP FUNCTION v2_job_completed_before_insert CASCADE; - DROP FUNCTION v2_job_completed_before_update CASCADE; - DROP FUNCTION v2_job_queue_after_insert CASCADE; - DROP FUNCTION v2_job_queue_before_insert CASCADE; - DROP FUNCTION v2_job_queue_before_update CASCADE; - DROP FUNCTION v2_job_runtime_before_insert CASCADE; - DROP FUNCTION v2_job_runtime_before_update CASCADE; - DROP FUNCTION v2_job_status_before_insert CASCADE; - DROP FUNCTION v2_job_status_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_after_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE; - DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; + DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE; "#, ) .await?; @@ -390,36 +393,36 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { tx.execute( r#" ALTER TABLE v2_job_queue - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __last_ping CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __flow_status CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __same_worker CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __pre_run_error CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __mem_peak CASCADE, - DROP COLUMN __root_job CASCADE, - DROP COLUMN __leaf_jobs CASCADE, - DROP COLUMN __concurrent_limit CASCADE, - DROP COLUMN __concurrency_time_window_s CASCADE, - DROP COLUMN __timeout CASCADE, - DROP COLUMN __flow_step_id CASCADE, - DROP COLUMN __cache_ttl CASCADE; + DROP COLUMN IF EXISTS __parent_job CASCADE, + DROP COLUMN IF EXISTS __created_by CASCADE, + DROP COLUMN IF EXISTS __script_hash CASCADE, + DROP COLUMN IF EXISTS __script_path CASCADE, + DROP COLUMN IF EXISTS __args CASCADE, + DROP COLUMN IF EXISTS __logs CASCADE, + DROP COLUMN IF EXISTS __raw_code CASCADE, + DROP COLUMN IF EXISTS __canceled CASCADE, + DROP COLUMN IF EXISTS __last_ping CASCADE, + DROP COLUMN IF EXISTS __job_kind CASCADE, + DROP COLUMN IF EXISTS __env_id CASCADE, + DROP COLUMN IF EXISTS __schedule_path CASCADE, + DROP COLUMN IF EXISTS __permissioned_as CASCADE, + DROP COLUMN IF EXISTS __flow_status CASCADE, + DROP COLUMN IF EXISTS __raw_flow CASCADE, + DROP COLUMN IF EXISTS __is_flow_step CASCADE, + DROP COLUMN IF EXISTS __language CASCADE, + DROP COLUMN IF EXISTS __same_worker CASCADE, + DROP COLUMN IF EXISTS __raw_lock CASCADE, + DROP COLUMN IF EXISTS __pre_run_error CASCADE, + DROP COLUMN IF EXISTS __email CASCADE, + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, + DROP COLUMN IF EXISTS __mem_peak CASCADE, + DROP COLUMN IF EXISTS __root_job CASCADE, + DROP COLUMN IF EXISTS __leaf_jobs CASCADE, + DROP COLUMN IF EXISTS __concurrent_limit CASCADE, + DROP COLUMN IF EXISTS __concurrency_time_window_s CASCADE, + DROP COLUMN IF EXISTS __timeout CASCADE, + DROP COLUMN IF EXISTS __flow_step_id CASCADE, + DROP COLUMN IF EXISTS __cache_ttl CASCADE; "#, ) .await?; @@ -427,31 +430,30 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { run_windmill_migration!("v2_finalize_job_completed", db, |tx| { tx.execute( r#" - LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; ALTER TABLE v2_job_completed - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __created_at CASCADE, - DROP COLUMN __success CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __is_skipped CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __tag CASCADE, - DROP COLUMN __priority CASCADE; + DROP COLUMN IF EXISTS __parent_job CASCADE, + DROP COLUMN IF EXISTS __created_by CASCADE, + DROP COLUMN IF EXISTS __created_at CASCADE, + DROP COLUMN IF EXISTS __success CASCADE, + DROP COLUMN IF EXISTS __script_hash CASCADE, + DROP COLUMN IF EXISTS __script_path CASCADE, + DROP COLUMN IF EXISTS __args CASCADE, + DROP COLUMN IF EXISTS __logs CASCADE, + DROP COLUMN IF EXISTS __raw_code CASCADE, + DROP COLUMN IF EXISTS __canceled CASCADE, + DROP COLUMN IF EXISTS __job_kind CASCADE, + DROP COLUMN IF EXISTS __env_id CASCADE, + DROP COLUMN IF EXISTS __schedule_path CASCADE, + DROP COLUMN IF EXISTS __permissioned_as CASCADE, + DROP COLUMN IF EXISTS __raw_flow CASCADE, + DROP COLUMN IF EXISTS __is_flow_step CASCADE, + DROP COLUMN IF EXISTS __language CASCADE, + DROP COLUMN IF EXISTS __is_skipped CASCADE, + DROP COLUMN IF EXISTS __raw_lock CASCADE, + DROP COLUMN IF EXISTS __email CASCADE, + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, + DROP COLUMN IF EXISTS __tag CASCADE, + DROP COLUMN IF EXISTS __priority CASCADE; "#, ) .await?; From 9a5fe90bddfc7c4569f5c85a6cd61b7f5e9ccfac Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 19:37:45 +0100 Subject: [PATCH 2/9] Revert "migration to remove unecessary triggers and fields after job v2" This reverts commit 029e2c7537778324e3ece5f8a3555e0f4bc153c8. --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/db.rs | 176 ++++++++++++++++----------------- 2 files changed, 88 insertions(+), 90 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index c94a57b20f..fa0585b17f 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f \ No newline at end of file +841642097f07cc1f765ef74059d66aae2eba2c1d \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index e768c5811d..9adae014d3 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -225,27 +225,27 @@ pub async fn migrate(db: &DB) -> Result<(), Error> { } }); - if !has_done_migration(db, "v2_finalize_disable_sync_II").await { - let db2 = db.clone(); - let _ = tokio::task::spawn(async move { - loop { - if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { - tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); - tokio::time::sleep(Duration::from_secs(5)).await; - continue; - } - if let Err(err) = v2_finalize(&db2).await { - tracing::error!( - "{err:#}: Could not apply v2 finalize migration, retry in 30s.." - ); - tokio::time::sleep(Duration::from_secs(30)).await; - continue; - } - tracing::info!("v2 finalization step successfully applied."); - break; - } - }); - } + // if !has_done_migration(db, "v2_finalize_disable_sync").await { + // let db2 = db.clone(); + // let _ = tokio::task::spawn(async move { + // loop { + // if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { + // tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); + // tokio::time::sleep(Duration::from_secs(5)).await; + // continue; + // } + // if let Err(err) = v2_finalize(&db2).await { + // tracing::error!( + // "{err:#}: Could not apply v2 finalize migration, retry in 30s.." + // ); + // tokio::time::sleep(Duration::from_secs(30)).await; + // continue; + // } + // tracing::info!("v2 finalization step successfully applied."); + // break; + // } + // }); + // } Ok(()) } @@ -329,12 +329,9 @@ macro_rules! run_windmill_migration { 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)"); - drop($tx); tokio::time::sleep(std::time::Duration::from_secs(5)).await; - $tx = db.begin().await?; } } tracing::info!("acquired lock for {migration_job_name}"); @@ -370,21 +367,21 @@ macro_rules! run_windmill_migration { } async fn v2_finalize(db: &DB) -> Result<(), Error> { - run_windmill_migration!("v2_finalize_disable_sync_II", db, |tx| { + run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { tx.execute( r#" - DROP FUNCTION IF EXISTS v2_job_after_update CASCADE; - DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE; - DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE; - DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE; - DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE; - DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE; - DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE; - DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE; - DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE; - DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE; + DROP FUNCTION v2_job_after_update CASCADE; + DROP FUNCTION v2_job_completed_before_insert CASCADE; + DROP FUNCTION v2_job_completed_before_update CASCADE; + DROP FUNCTION v2_job_queue_after_insert CASCADE; + DROP FUNCTION v2_job_queue_before_insert CASCADE; + DROP FUNCTION v2_job_queue_before_update CASCADE; + DROP FUNCTION v2_job_runtime_before_insert CASCADE; + DROP FUNCTION v2_job_runtime_before_update CASCADE; + DROP FUNCTION v2_job_status_before_insert CASCADE; + DROP FUNCTION v2_job_status_before_update CASCADE; - DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE; + DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; "#, ) .await?; @@ -393,36 +390,36 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { tx.execute( r#" ALTER TABLE v2_job_queue - DROP COLUMN IF EXISTS __parent_job CASCADE, - DROP COLUMN IF EXISTS __created_by CASCADE, - DROP COLUMN IF EXISTS __script_hash CASCADE, - DROP COLUMN IF EXISTS __script_path CASCADE, - DROP COLUMN IF EXISTS __args CASCADE, - DROP COLUMN IF EXISTS __logs CASCADE, - DROP COLUMN IF EXISTS __raw_code CASCADE, - DROP COLUMN IF EXISTS __canceled CASCADE, - DROP COLUMN IF EXISTS __last_ping CASCADE, - DROP COLUMN IF EXISTS __job_kind CASCADE, - DROP COLUMN IF EXISTS __env_id CASCADE, - DROP COLUMN IF EXISTS __schedule_path CASCADE, - DROP COLUMN IF EXISTS __permissioned_as CASCADE, - DROP COLUMN IF EXISTS __flow_status CASCADE, - DROP COLUMN IF EXISTS __raw_flow CASCADE, - DROP COLUMN IF EXISTS __is_flow_step CASCADE, - DROP COLUMN IF EXISTS __language CASCADE, - DROP COLUMN IF EXISTS __same_worker CASCADE, - DROP COLUMN IF EXISTS __raw_lock CASCADE, - DROP COLUMN IF EXISTS __pre_run_error CASCADE, - DROP COLUMN IF EXISTS __email CASCADE, - DROP COLUMN IF EXISTS __visible_to_owner CASCADE, - DROP COLUMN IF EXISTS __mem_peak CASCADE, - DROP COLUMN IF EXISTS __root_job CASCADE, - DROP COLUMN IF EXISTS __leaf_jobs CASCADE, - DROP COLUMN IF EXISTS __concurrent_limit CASCADE, - DROP COLUMN IF EXISTS __concurrency_time_window_s CASCADE, - DROP COLUMN IF EXISTS __timeout CASCADE, - DROP COLUMN IF EXISTS __flow_step_id CASCADE, - DROP COLUMN IF EXISTS __cache_ttl CASCADE; + DROP COLUMN __parent_job CASCADE, + DROP COLUMN __created_by CASCADE, + DROP COLUMN __script_hash CASCADE, + DROP COLUMN __script_path CASCADE, + DROP COLUMN __args CASCADE, + DROP COLUMN __logs CASCADE, + DROP COLUMN __raw_code CASCADE, + DROP COLUMN __canceled CASCADE, + DROP COLUMN __last_ping CASCADE, + DROP COLUMN __job_kind CASCADE, + DROP COLUMN __env_id CASCADE, + DROP COLUMN __schedule_path CASCADE, + DROP COLUMN __permissioned_as CASCADE, + DROP COLUMN __flow_status CASCADE, + DROP COLUMN __raw_flow CASCADE, + DROP COLUMN __is_flow_step CASCADE, + DROP COLUMN __language CASCADE, + DROP COLUMN __same_worker CASCADE, + DROP COLUMN __raw_lock CASCADE, + DROP COLUMN __pre_run_error CASCADE, + DROP COLUMN __email CASCADE, + DROP COLUMN __visible_to_owner CASCADE, + DROP COLUMN __mem_peak CASCADE, + DROP COLUMN __root_job CASCADE, + DROP COLUMN __leaf_jobs CASCADE, + DROP COLUMN __concurrent_limit CASCADE, + DROP COLUMN __concurrency_time_window_s CASCADE, + DROP COLUMN __timeout CASCADE, + DROP COLUMN __flow_step_id CASCADE, + DROP COLUMN __cache_ttl CASCADE; "#, ) .await?; @@ -430,30 +427,31 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { run_windmill_migration!("v2_finalize_job_completed", db, |tx| { tx.execute( r#" + LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; ALTER TABLE v2_job_completed - DROP COLUMN IF EXISTS __parent_job CASCADE, - DROP COLUMN IF EXISTS __created_by CASCADE, - DROP COLUMN IF EXISTS __created_at CASCADE, - DROP COLUMN IF EXISTS __success CASCADE, - DROP COLUMN IF EXISTS __script_hash CASCADE, - DROP COLUMN IF EXISTS __script_path CASCADE, - DROP COLUMN IF EXISTS __args CASCADE, - DROP COLUMN IF EXISTS __logs CASCADE, - DROP COLUMN IF EXISTS __raw_code CASCADE, - DROP COLUMN IF EXISTS __canceled CASCADE, - DROP COLUMN IF EXISTS __job_kind CASCADE, - DROP COLUMN IF EXISTS __env_id CASCADE, - DROP COLUMN IF EXISTS __schedule_path CASCADE, - DROP COLUMN IF EXISTS __permissioned_as CASCADE, - DROP COLUMN IF EXISTS __raw_flow CASCADE, - DROP COLUMN IF EXISTS __is_flow_step CASCADE, - DROP COLUMN IF EXISTS __language CASCADE, - DROP COLUMN IF EXISTS __is_skipped CASCADE, - DROP COLUMN IF EXISTS __raw_lock CASCADE, - DROP COLUMN IF EXISTS __email CASCADE, - DROP COLUMN IF EXISTS __visible_to_owner CASCADE, - DROP COLUMN IF EXISTS __tag CASCADE, - DROP COLUMN IF EXISTS __priority CASCADE; + DROP COLUMN __parent_job CASCADE, + DROP COLUMN __created_by CASCADE, + DROP COLUMN __created_at CASCADE, + DROP COLUMN __success CASCADE, + DROP COLUMN __script_hash CASCADE, + DROP COLUMN __script_path CASCADE, + DROP COLUMN __args CASCADE, + DROP COLUMN __logs CASCADE, + DROP COLUMN __raw_code CASCADE, + DROP COLUMN __canceled CASCADE, + DROP COLUMN __job_kind CASCADE, + DROP COLUMN __env_id CASCADE, + DROP COLUMN __schedule_path CASCADE, + DROP COLUMN __permissioned_as CASCADE, + DROP COLUMN __raw_flow CASCADE, + DROP COLUMN __is_flow_step CASCADE, + DROP COLUMN __language CASCADE, + DROP COLUMN __is_skipped CASCADE, + DROP COLUMN __raw_lock CASCADE, + DROP COLUMN __email CASCADE, + DROP COLUMN __visible_to_owner CASCADE, + DROP COLUMN __tag CASCADE, + DROP COLUMN __priority CASCADE; "#, ) .await?; From b6a57207a243bcb2cdb94705078a65ae32738131 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 19:38:58 +0100 Subject: [PATCH 3/9] revert last commit --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/db.rs | 186 ++++++++++++++++----------------- 2 files changed, 93 insertions(+), 95 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index fa0585b17f..c94a57b20f 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -841642097f07cc1f765ef74059d66aae2eba2c1d \ No newline at end of file +703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 9adae014d3..8463b7684b 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -6,8 +6,6 @@ * LICENSE-AGPL for a copy of the license. */ -use std::time::Duration; - use futures::FutureExt; use sqlx::{ migrate::{Migrate, MigrateError}, @@ -16,11 +14,11 @@ use sqlx::{ }; use windmill_audit::audit_ee::{AuditAuthor, AuditAuthorable}; +use windmill_common::utils::generate_lock_id; use windmill_common::{ db::{Authable, Authed}, error::Error, }; -use windmill_common::{utils::generate_lock_id, worker::MIN_VERSION_IS_AT_LEAST_1_461}; pub type DB = Pool; @@ -366,98 +364,98 @@ macro_rules! run_windmill_migration { }; } -async fn v2_finalize(db: &DB) -> Result<(), Error> { - run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { - tx.execute( - r#" - DROP FUNCTION v2_job_after_update CASCADE; - DROP FUNCTION v2_job_completed_before_insert CASCADE; - DROP FUNCTION v2_job_completed_before_update CASCADE; - DROP FUNCTION v2_job_queue_after_insert CASCADE; - DROP FUNCTION v2_job_queue_before_insert CASCADE; - DROP FUNCTION v2_job_queue_before_update CASCADE; - DROP FUNCTION v2_job_runtime_before_insert CASCADE; - DROP FUNCTION v2_job_runtime_before_update CASCADE; - DROP FUNCTION v2_job_status_before_insert CASCADE; - DROP FUNCTION v2_job_status_before_update CASCADE; +// async fn v2_finalize(db: &DB) -> Result<(), Error> { +// run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { +// tx.execute( +// r#" +// DROP FUNCTION v2_job_after_update CASCADE; +// DROP FUNCTION v2_job_completed_before_insert CASCADE; +// DROP FUNCTION v2_job_completed_before_update CASCADE; +// DROP FUNCTION v2_job_queue_after_insert CASCADE; +// DROP FUNCTION v2_job_queue_before_insert CASCADE; +// DROP FUNCTION v2_job_queue_before_update CASCADE; +// DROP FUNCTION v2_job_runtime_before_insert CASCADE; +// DROP FUNCTION v2_job_runtime_before_update CASCADE; +// DROP FUNCTION v2_job_status_before_insert CASCADE; +// DROP FUNCTION v2_job_status_before_update CASCADE; - DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; - "#, - ) - .await?; - }); - run_windmill_migration!("v2_finalize_job_queue", db, |tx| { - tx.execute( - r#" - ALTER TABLE v2_job_queue - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __last_ping CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __flow_status CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __same_worker CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __pre_run_error CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __mem_peak CASCADE, - DROP COLUMN __root_job CASCADE, - DROP COLUMN __leaf_jobs CASCADE, - DROP COLUMN __concurrent_limit CASCADE, - DROP COLUMN __concurrency_time_window_s CASCADE, - DROP COLUMN __timeout CASCADE, - DROP COLUMN __flow_step_id CASCADE, - DROP COLUMN __cache_ttl CASCADE; - "#, - ) - .await?; - }); - run_windmill_migration!("v2_finalize_job_completed", db, |tx| { - tx.execute( - r#" - LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; - ALTER TABLE v2_job_completed - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __created_at CASCADE, - DROP COLUMN __success CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __is_skipped CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __tag CASCADE, - DROP COLUMN __priority CASCADE; - "#, - ) - .await?; - }); - Ok(()) -} +// DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; +// "#, +// ) +// .await?; +// }); +// run_windmill_migration!("v2_finalize_job_queue", db, |tx| { +// tx.execute( +// r#" +// ALTER TABLE v2_job_queue +// DROP COLUMN __parent_job CASCADE, +// DROP COLUMN __created_by CASCADE, +// DROP COLUMN __script_hash CASCADE, +// DROP COLUMN __script_path CASCADE, +// DROP COLUMN __args CASCADE, +// DROP COLUMN __logs CASCADE, +// DROP COLUMN __raw_code CASCADE, +// DROP COLUMN __canceled CASCADE, +// DROP COLUMN __last_ping CASCADE, +// DROP COLUMN __job_kind CASCADE, +// DROP COLUMN __env_id CASCADE, +// DROP COLUMN __schedule_path CASCADE, +// DROP COLUMN __permissioned_as CASCADE, +// DROP COLUMN __flow_status CASCADE, +// DROP COLUMN __raw_flow CASCADE, +// DROP COLUMN __is_flow_step CASCADE, +// DROP COLUMN __language CASCADE, +// DROP COLUMN __same_worker CASCADE, +// DROP COLUMN __raw_lock CASCADE, +// DROP COLUMN __pre_run_error CASCADE, +// DROP COLUMN __email CASCADE, +// DROP COLUMN __visible_to_owner CASCADE, +// DROP COLUMN __mem_peak CASCADE, +// DROP COLUMN __root_job CASCADE, +// DROP COLUMN __leaf_jobs CASCADE, +// DROP COLUMN __concurrent_limit CASCADE, +// DROP COLUMN __concurrency_time_window_s CASCADE, +// DROP COLUMN __timeout CASCADE, +// DROP COLUMN __flow_step_id CASCADE, +// DROP COLUMN __cache_ttl CASCADE; +// "#, +// ) +// .await?; +// }); +// run_windmill_migration!("v2_finalize_job_completed", db, |tx| { +// tx.execute( +// r#" +// LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; +// ALTER TABLE v2_job_completed +// DROP COLUMN __parent_job CASCADE, +// DROP COLUMN __created_by CASCADE, +// DROP COLUMN __created_at CASCADE, +// DROP COLUMN __success CASCADE, +// DROP COLUMN __script_hash CASCADE, +// DROP COLUMN __script_path CASCADE, +// DROP COLUMN __args CASCADE, +// DROP COLUMN __logs CASCADE, +// DROP COLUMN __raw_code CASCADE, +// DROP COLUMN __canceled CASCADE, +// DROP COLUMN __job_kind CASCADE, +// DROP COLUMN __env_id CASCADE, +// DROP COLUMN __schedule_path CASCADE, +// DROP COLUMN __permissioned_as CASCADE, +// DROP COLUMN __raw_flow CASCADE, +// DROP COLUMN __is_flow_step CASCADE, +// DROP COLUMN __language CASCADE, +// DROP COLUMN __is_skipped CASCADE, +// DROP COLUMN __raw_lock CASCADE, +// DROP COLUMN __email CASCADE, +// DROP COLUMN __visible_to_owner CASCADE, +// DROP COLUMN __tag CASCADE, +// DROP COLUMN __priority CASCADE; +// "#, +// ) +// .await?; +// }); +// Ok(()) +// } async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { // let has_done_migration = sqlx::query_scalar!( From fad6dc4400f0b6dcd68817d4bc4edc9198c7a20a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 19:45:52 +0100 Subject: [PATCH 4/9] Revert "revert last commit" This reverts commit b6a57207a243bcb2cdb94705078a65ae32738131. --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/db.rs | 186 +++++++++++++++++---------------- 2 files changed, 95 insertions(+), 93 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index c94a57b20f..fa0585b17f 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f \ No newline at end of file +841642097f07cc1f765ef74059d66aae2eba2c1d \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 8463b7684b..9adae014d3 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -6,6 +6,8 @@ * LICENSE-AGPL for a copy of the license. */ +use std::time::Duration; + use futures::FutureExt; use sqlx::{ migrate::{Migrate, MigrateError}, @@ -14,11 +16,11 @@ use sqlx::{ }; use windmill_audit::audit_ee::{AuditAuthor, AuditAuthorable}; -use windmill_common::utils::generate_lock_id; use windmill_common::{ db::{Authable, Authed}, error::Error, }; +use windmill_common::{utils::generate_lock_id, worker::MIN_VERSION_IS_AT_LEAST_1_461}; pub type DB = Pool; @@ -364,98 +366,98 @@ macro_rules! run_windmill_migration { }; } -// async fn v2_finalize(db: &DB) -> Result<(), Error> { -// run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { -// tx.execute( -// r#" -// DROP FUNCTION v2_job_after_update CASCADE; -// DROP FUNCTION v2_job_completed_before_insert CASCADE; -// DROP FUNCTION v2_job_completed_before_update CASCADE; -// DROP FUNCTION v2_job_queue_after_insert CASCADE; -// DROP FUNCTION v2_job_queue_before_insert CASCADE; -// DROP FUNCTION v2_job_queue_before_update CASCADE; -// DROP FUNCTION v2_job_runtime_before_insert CASCADE; -// DROP FUNCTION v2_job_runtime_before_update CASCADE; -// DROP FUNCTION v2_job_status_before_insert CASCADE; -// DROP FUNCTION v2_job_status_before_update CASCADE; +async fn v2_finalize(db: &DB) -> Result<(), Error> { + run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { + tx.execute( + r#" + DROP FUNCTION v2_job_after_update CASCADE; + DROP FUNCTION v2_job_completed_before_insert CASCADE; + DROP FUNCTION v2_job_completed_before_update CASCADE; + DROP FUNCTION v2_job_queue_after_insert CASCADE; + DROP FUNCTION v2_job_queue_before_insert CASCADE; + DROP FUNCTION v2_job_queue_before_update CASCADE; + DROP FUNCTION v2_job_runtime_before_insert CASCADE; + DROP FUNCTION v2_job_runtime_before_update CASCADE; + DROP FUNCTION v2_job_status_before_insert CASCADE; + DROP FUNCTION v2_job_status_before_update CASCADE; -// DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; -// "#, -// ) -// .await?; -// }); -// run_windmill_migration!("v2_finalize_job_queue", db, |tx| { -// tx.execute( -// r#" -// ALTER TABLE v2_job_queue -// DROP COLUMN __parent_job CASCADE, -// DROP COLUMN __created_by CASCADE, -// DROP COLUMN __script_hash CASCADE, -// DROP COLUMN __script_path CASCADE, -// DROP COLUMN __args CASCADE, -// DROP COLUMN __logs CASCADE, -// DROP COLUMN __raw_code CASCADE, -// DROP COLUMN __canceled CASCADE, -// DROP COLUMN __last_ping CASCADE, -// DROP COLUMN __job_kind CASCADE, -// DROP COLUMN __env_id CASCADE, -// DROP COLUMN __schedule_path CASCADE, -// DROP COLUMN __permissioned_as CASCADE, -// DROP COLUMN __flow_status CASCADE, -// DROP COLUMN __raw_flow CASCADE, -// DROP COLUMN __is_flow_step CASCADE, -// DROP COLUMN __language CASCADE, -// DROP COLUMN __same_worker CASCADE, -// DROP COLUMN __raw_lock CASCADE, -// DROP COLUMN __pre_run_error CASCADE, -// DROP COLUMN __email CASCADE, -// DROP COLUMN __visible_to_owner CASCADE, -// DROP COLUMN __mem_peak CASCADE, -// DROP COLUMN __root_job CASCADE, -// DROP COLUMN __leaf_jobs CASCADE, -// DROP COLUMN __concurrent_limit CASCADE, -// DROP COLUMN __concurrency_time_window_s CASCADE, -// DROP COLUMN __timeout CASCADE, -// DROP COLUMN __flow_step_id CASCADE, -// DROP COLUMN __cache_ttl CASCADE; -// "#, -// ) -// .await?; -// }); -// run_windmill_migration!("v2_finalize_job_completed", db, |tx| { -// tx.execute( -// r#" -// LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; -// ALTER TABLE v2_job_completed -// DROP COLUMN __parent_job CASCADE, -// DROP COLUMN __created_by CASCADE, -// DROP COLUMN __created_at CASCADE, -// DROP COLUMN __success CASCADE, -// DROP COLUMN __script_hash CASCADE, -// DROP COLUMN __script_path CASCADE, -// DROP COLUMN __args CASCADE, -// DROP COLUMN __logs CASCADE, -// DROP COLUMN __raw_code CASCADE, -// DROP COLUMN __canceled CASCADE, -// DROP COLUMN __job_kind CASCADE, -// DROP COLUMN __env_id CASCADE, -// DROP COLUMN __schedule_path CASCADE, -// DROP COLUMN __permissioned_as CASCADE, -// DROP COLUMN __raw_flow CASCADE, -// DROP COLUMN __is_flow_step CASCADE, -// DROP COLUMN __language CASCADE, -// DROP COLUMN __is_skipped CASCADE, -// DROP COLUMN __raw_lock CASCADE, -// DROP COLUMN __email CASCADE, -// DROP COLUMN __visible_to_owner CASCADE, -// DROP COLUMN __tag CASCADE, -// DROP COLUMN __priority CASCADE; -// "#, -// ) -// .await?; -// }); -// Ok(()) -// } + DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; + "#, + ) + .await?; + }); + run_windmill_migration!("v2_finalize_job_queue", db, |tx| { + tx.execute( + r#" + ALTER TABLE v2_job_queue + DROP COLUMN __parent_job CASCADE, + DROP COLUMN __created_by CASCADE, + DROP COLUMN __script_hash CASCADE, + DROP COLUMN __script_path CASCADE, + DROP COLUMN __args CASCADE, + DROP COLUMN __logs CASCADE, + DROP COLUMN __raw_code CASCADE, + DROP COLUMN __canceled CASCADE, + DROP COLUMN __last_ping CASCADE, + DROP COLUMN __job_kind CASCADE, + DROP COLUMN __env_id CASCADE, + DROP COLUMN __schedule_path CASCADE, + DROP COLUMN __permissioned_as CASCADE, + DROP COLUMN __flow_status CASCADE, + DROP COLUMN __raw_flow CASCADE, + DROP COLUMN __is_flow_step CASCADE, + DROP COLUMN __language CASCADE, + DROP COLUMN __same_worker CASCADE, + DROP COLUMN __raw_lock CASCADE, + DROP COLUMN __pre_run_error CASCADE, + DROP COLUMN __email CASCADE, + DROP COLUMN __visible_to_owner CASCADE, + DROP COLUMN __mem_peak CASCADE, + DROP COLUMN __root_job CASCADE, + DROP COLUMN __leaf_jobs CASCADE, + DROP COLUMN __concurrent_limit CASCADE, + DROP COLUMN __concurrency_time_window_s CASCADE, + DROP COLUMN __timeout CASCADE, + DROP COLUMN __flow_step_id CASCADE, + DROP COLUMN __cache_ttl CASCADE; + "#, + ) + .await?; + }); + run_windmill_migration!("v2_finalize_job_completed", db, |tx| { + tx.execute( + r#" + LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; + ALTER TABLE v2_job_completed + DROP COLUMN __parent_job CASCADE, + DROP COLUMN __created_by CASCADE, + DROP COLUMN __created_at CASCADE, + DROP COLUMN __success CASCADE, + DROP COLUMN __script_hash CASCADE, + DROP COLUMN __script_path CASCADE, + DROP COLUMN __args CASCADE, + DROP COLUMN __logs CASCADE, + DROP COLUMN __raw_code CASCADE, + DROP COLUMN __canceled CASCADE, + DROP COLUMN __job_kind CASCADE, + DROP COLUMN __env_id CASCADE, + DROP COLUMN __schedule_path CASCADE, + DROP COLUMN __permissioned_as CASCADE, + DROP COLUMN __raw_flow CASCADE, + DROP COLUMN __is_flow_step CASCADE, + DROP COLUMN __language CASCADE, + DROP COLUMN __is_skipped CASCADE, + DROP COLUMN __raw_lock CASCADE, + DROP COLUMN __email CASCADE, + DROP COLUMN __visible_to_owner CASCADE, + DROP COLUMN __tag CASCADE, + DROP COLUMN __priority CASCADE; + "#, + ) + .await?; + }); + Ok(()) +} async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { // let has_done_migration = sqlx::query_scalar!( From 1e45903d78ace9bdb7c0859b4296b1b9219b0229 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 19:56:21 +0100 Subject: [PATCH 5/9] re-do the migration finalization but now with BYPASSRLS for v2_job_queue and v2_job_completed --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/db.rs | 180 +++++++++++++++++---------------- 2 files changed, 94 insertions(+), 88 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index fa0585b17f..c94a57b20f 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -841642097f07cc1f765ef74059d66aae2eba2c1d \ No newline at end of file +703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 9adae014d3..a4c6fe3c72 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -225,27 +225,27 @@ pub async fn migrate(db: &DB) -> Result<(), Error> { } }); - // if !has_done_migration(db, "v2_finalize_disable_sync").await { - // let db2 = db.clone(); - // let _ = tokio::task::spawn(async move { - // loop { - // if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { - // tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); - // tokio::time::sleep(Duration::from_secs(5)).await; - // continue; - // } - // if let Err(err) = v2_finalize(&db2).await { - // tracing::error!( - // "{err:#}: Could not apply v2 finalize migration, retry in 30s.." - // ); - // tokio::time::sleep(Duration::from_secs(30)).await; - // continue; - // } - // tracing::info!("v2 finalization step successfully applied."); - // break; - // } - // }); - // } + if !has_done_migration(db, "v2_finalize_disable_sync_III").await { + let db2 = db.clone(); + let _ = tokio::task::spawn(async move { + loop { + if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await { + tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s..."); + tokio::time::sleep(Duration::from_secs(5)).await; + continue; + } + if let Err(err) = v2_finalize(&db2).await { + tracing::error!( + "{err:#}: Could not apply v2 finalize migration, retry in 30s.." + ); + tokio::time::sleep(Duration::from_secs(30)).await; + continue; + } + tracing::info!("v2 finalization step successfully applied."); + break; + } + }); + } Ok(()) } @@ -329,9 +329,12 @@ macro_rules! run_windmill_migration { 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)"); + drop($tx); tokio::time::sleep(std::time::Duration::from_secs(5)).await; + $tx = db.begin().await?; } } tracing::info!("acquired lock for {migration_job_name}"); @@ -367,21 +370,25 @@ macro_rules! run_windmill_migration { } async fn v2_finalize(db: &DB) -> Result<(), Error> { - run_windmill_migration!("v2_finalize_disable_sync", db, |tx| { + run_windmill_migration!("v2_finalize_disable_sync_III", db, |tx| { tx.execute( r#" - DROP FUNCTION v2_job_after_update CASCADE; - DROP FUNCTION v2_job_completed_before_insert CASCADE; - DROP FUNCTION v2_job_completed_before_update CASCADE; - DROP FUNCTION v2_job_queue_after_insert CASCADE; - DROP FUNCTION v2_job_queue_before_insert CASCADE; - DROP FUNCTION v2_job_queue_before_update CASCADE; - DROP FUNCTION v2_job_runtime_before_insert CASCADE; - DROP FUNCTION v2_job_runtime_before_update CASCADE; - DROP FUNCTION v2_job_status_before_insert CASCADE; - DROP FUNCTION v2_job_status_before_update CASCADE; + ALTER TABLE v2_job_queue DISABLE ROW LEVEL SECURITY; + ALTER TABLE v2_job_completed DISABLE ROW LEVEL SECURITY; - DROP VIEW completed_job, completed_job_view, job, queue, queue_view CASCADE; + DROP FUNCTION IF EXISTS v2_job_after_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE; + DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE; + DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE; + + DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE; + "#, ) .await?; @@ -390,36 +397,36 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { tx.execute( r#" ALTER TABLE v2_job_queue - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __last_ping CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __flow_status CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __same_worker CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __pre_run_error CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __mem_peak CASCADE, - DROP COLUMN __root_job CASCADE, - DROP COLUMN __leaf_jobs CASCADE, - DROP COLUMN __concurrent_limit CASCADE, - DROP COLUMN __concurrency_time_window_s CASCADE, - DROP COLUMN __timeout CASCADE, - DROP COLUMN __flow_step_id CASCADE, - DROP COLUMN __cache_ttl CASCADE; + DROP COLUMN IF EXISTS __parent_job CASCADE, + DROP COLUMN IF EXISTS __created_by CASCADE, + DROP COLUMN IF EXISTS __script_hash CASCADE, + DROP COLUMN IF EXISTS __script_path CASCADE, + DROP COLUMN IF EXISTS __args CASCADE, + DROP COLUMN IF EXISTS __logs CASCADE, + DROP COLUMN IF EXISTS __raw_code CASCADE, + DROP COLUMN IF EXISTS __canceled CASCADE, + DROP COLUMN IF EXISTS __last_ping CASCADE, + DROP COLUMN IF EXISTS __job_kind CASCADE, + DROP COLUMN IF EXISTS __env_id CASCADE, + DROP COLUMN IF EXISTS __schedule_path CASCADE, + DROP COLUMN IF EXISTS __permissioned_as CASCADE, + DROP COLUMN IF EXISTS __flow_status CASCADE, + DROP COLUMN IF EXISTS __raw_flow CASCADE, + DROP COLUMN IF EXISTS __is_flow_step CASCADE, + DROP COLUMN IF EXISTS __language CASCADE, + DROP COLUMN IF EXISTS __same_worker CASCADE, + DROP COLUMN IF EXISTS __raw_lock CASCADE, + DROP COLUMN IF EXISTS __pre_run_error CASCADE, + DROP COLUMN IF EXISTS __email CASCADE, + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, + DROP COLUMN IF EXISTS __mem_peak CASCADE, + DROP COLUMN IF EXISTS __root_job CASCADE, + DROP COLUMN IF EXISTS __leaf_jobs CASCADE, + DROP COLUMN IF EXISTS __concurrent_limit CASCADE, + DROP COLUMN IF EXISTS __concurrency_time_window_s CASCADE, + DROP COLUMN IF EXISTS __timeout CASCADE, + DROP COLUMN IF EXISTS __flow_step_id CASCADE, + DROP COLUMN IF EXISTS __cache_ttl CASCADE; "#, ) .await?; @@ -427,31 +434,30 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> { run_windmill_migration!("v2_finalize_job_completed", db, |tx| { tx.execute( r#" - LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; ALTER TABLE v2_job_completed - DROP COLUMN __parent_job CASCADE, - DROP COLUMN __created_by CASCADE, - DROP COLUMN __created_at CASCADE, - DROP COLUMN __success CASCADE, - DROP COLUMN __script_hash CASCADE, - DROP COLUMN __script_path CASCADE, - DROP COLUMN __args CASCADE, - DROP COLUMN __logs CASCADE, - DROP COLUMN __raw_code CASCADE, - DROP COLUMN __canceled CASCADE, - DROP COLUMN __job_kind CASCADE, - DROP COLUMN __env_id CASCADE, - DROP COLUMN __schedule_path CASCADE, - DROP COLUMN __permissioned_as CASCADE, - DROP COLUMN __raw_flow CASCADE, - DROP COLUMN __is_flow_step CASCADE, - DROP COLUMN __language CASCADE, - DROP COLUMN __is_skipped CASCADE, - DROP COLUMN __raw_lock CASCADE, - DROP COLUMN __email CASCADE, - DROP COLUMN __visible_to_owner CASCADE, - DROP COLUMN __tag CASCADE, - DROP COLUMN __priority CASCADE; + DROP COLUMN IF EXISTS __parent_job CASCADE, + DROP COLUMN IF EXISTS __created_by CASCADE, + DROP COLUMN IF EXISTS __created_at CASCADE, + DROP COLUMN IF EXISTS __success CASCADE, + DROP COLUMN IF EXISTS __script_hash CASCADE, + DROP COLUMN IF EXISTS __script_path CASCADE, + DROP COLUMN IF EXISTS __args CASCADE, + DROP COLUMN IF EXISTS __logs CASCADE, + DROP COLUMN IF EXISTS __raw_code CASCADE, + DROP COLUMN IF EXISTS __canceled CASCADE, + DROP COLUMN IF EXISTS __job_kind CASCADE, + DROP COLUMN IF EXISTS __env_id CASCADE, + DROP COLUMN IF EXISTS __schedule_path CASCADE, + DROP COLUMN IF EXISTS __permissioned_as CASCADE, + DROP COLUMN IF EXISTS __raw_flow CASCADE, + DROP COLUMN IF EXISTS __is_flow_step CASCADE, + DROP COLUMN IF EXISTS __language CASCADE, + DROP COLUMN IF EXISTS __is_skipped CASCADE, + DROP COLUMN IF EXISTS __raw_lock CASCADE, + DROP COLUMN IF EXISTS __email CASCADE, + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, + DROP COLUMN IF EXISTS __tag CASCADE, + DROP COLUMN IF EXISTS __priority CASCADE; "#, ) .await?; From f15b67b4e455c2d1d61c2c0991cc25b4ee37d67e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 20:16:00 +0100 Subject: [PATCH 6/9] workspace colors fix --- ...fd853afc1f1ad354599de11ebc6e256b58543265.json | 12 ------------ ...5ef97dfd5eeda5977a8746be77c8aa65a7ec299e.json | 12 ------------ ...f6a7a47667b6f9f3dc0d51987cce159433459ab0.json | 12 ------------ ...85d8c6395e2440ea27553b7ccb18d7149b106728.json | 12 ------------ ...48e89569fe5666e36ca2650dabd9b494dc30f435.json | 12 ------------ ...c30b1bf1f70e17486a9d315db130852d5e325200.json | 12 ------------ ...acfa6854a34a99d2bf107feaafc499588f7330a0.json | 12 ------------ ...c08cb3c037309f09e84acbb7945a0466d6e9f576.json | 12 ------------ ...608cf0b385bff14faab495e049f2029790f76d25.json | 12 ------------ ...4a080e111a159a749728ce5363100cf883bdf02a.json | 12 ------------ ...ce634b976cbe0280e7215862aaf5ef445663793d.json | 12 ------------ ...aaef3741b9782d8e2d4b6ff6c104fdcac5f58323.json | 12 ------------ ...4e62c86a69b7b7378333322a57856f8e43c6cd77.json | 12 ------------ ...40508835affcb7679a48f2a443777e829bd1e74.json} | 16 ++++++++-------- backend/windmill-api/src/workspaces.rs | 2 +- 15 files changed, 9 insertions(+), 165 deletions(-) delete mode 100644 backend/.sqlx/query-42177e249794a4b7b945b93efd853afc1f1ad354599de11ebc6e256b58543265.json delete mode 100644 backend/.sqlx/query-4d3bbcc029ec0926bf97de4b5ef97dfd5eeda5977a8746be77c8aa65a7ec299e.json delete mode 100644 backend/.sqlx/query-608393951c85d9e721b506d2f6a7a47667b6f9f3dc0d51987cce159433459ab0.json delete mode 100644 backend/.sqlx/query-6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728.json delete mode 100644 backend/.sqlx/query-74754b03304a69391d61560848e89569fe5666e36ca2650dabd9b494dc30f435.json delete mode 100644 backend/.sqlx/query-85181656012b18cd26998128c30b1bf1f70e17486a9d315db130852d5e325200.json delete mode 100644 backend/.sqlx/query-93586f1ffc7b8dbe62b21a21acfa6854a34a99d2bf107feaafc499588f7330a0.json delete mode 100644 backend/.sqlx/query-cb5a8545ea140ed69c7b70d8c08cb3c037309f09e84acbb7945a0466d6e9f576.json delete mode 100644 backend/.sqlx/query-d949e8b91fbdf4c50c1c2cbc608cf0b385bff14faab495e049f2029790f76d25.json delete mode 100644 backend/.sqlx/query-e00144305b880cca3994b53c4a080e111a159a749728ce5363100cf883bdf02a.json delete mode 100644 backend/.sqlx/query-e9038a6fcfd8bdf4855c5919ce634b976cbe0280e7215862aaf5ef445663793d.json delete mode 100644 backend/.sqlx/query-ebfd39f168722701fb63cd37aaef3741b9782d8e2d4b6ff6c104fdcac5f58323.json delete mode 100644 backend/.sqlx/query-fa94a9ee5514f6808d3813394e62c86a69b7b7378333322a57856f8e43c6cd77.json rename backend/.sqlx/{query-72f98539ff9874479f6fc0e9f45f55354ad0397356c67a6162249a3cc553f125.json => query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json} (74%) diff --git a/backend/.sqlx/query-42177e249794a4b7b945b93efd853afc1f1ad354599de11ebc6e256b58543265.json b/backend/.sqlx/query-42177e249794a4b7b945b93efd853afc1f1ad354599de11ebc6e256b58543265.json deleted file mode 100644 index 71171ad831..0000000000 --- a/backend/.sqlx/query-42177e249794a4b7b945b93efd853afc1f1ad354599de11ebc6e256b58543265.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_6", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "42177e249794a4b7b945b93efd853afc1f1ad354599de11ebc6e256b58543265" -} diff --git a/backend/.sqlx/query-4d3bbcc029ec0926bf97de4b5ef97dfd5eeda5977a8746be77c8aa65a7ec299e.json b/backend/.sqlx/query-4d3bbcc029ec0926bf97de4b5ef97dfd5eeda5977a8746be77c8aa65a7ec299e.json deleted file mode 100644 index 4c983c95a3..0000000000 --- a/backend/.sqlx/query-4d3bbcc029ec0926bf97de4b5ef97dfd5eeda5977a8746be77c8aa65a7ec299e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS concurrency_limit_stats_completed_job", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "4d3bbcc029ec0926bf97de4b5ef97dfd5eeda5977a8746be77c8aa65a7ec299e" -} diff --git a/backend/.sqlx/query-608393951c85d9e721b506d2f6a7a47667b6f9f3dc0d51987cce159433459ab0.json b/backend/.sqlx/query-608393951c85d9e721b506d2f6a7a47667b6f9f3dc0d51987cce159433459ab0.json deleted file mode 100644 index 2808d96d51..0000000000 --- a/backend/.sqlx/query-608393951c85d9e721b506d2f6a7a47667b6f9f3dc0d51987cce159433459ab0.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_started_at_new", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "608393951c85d9e721b506d2f6a7a47667b6f9f3dc0d51987cce159433459ab0" -} diff --git a/backend/.sqlx/query-6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728.json b/backend/.sqlx/query-6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728.json deleted file mode 100644 index fce1c4942a..0000000000 --- a/backend/.sqlx/query-6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS root_job_index_by_path_2", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728" -} diff --git a/backend/.sqlx/query-74754b03304a69391d61560848e89569fe5666e36ca2650dabd9b494dc30f435.json b/backend/.sqlx/query-74754b03304a69391d61560848e89569fe5666e36ca2650dabd9b494dc30f435.json deleted file mode 100644 index 50372c7cc6..0000000000 --- a/backend/.sqlx/query-74754b03304a69391d61560848e89569fe5666e36ca2650dabd9b494dc30f435.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_2", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "74754b03304a69391d61560848e89569fe5666e36ca2650dabd9b494dc30f435" -} diff --git a/backend/.sqlx/query-85181656012b18cd26998128c30b1bf1f70e17486a9d315db130852d5e325200.json b/backend/.sqlx/query-85181656012b18cd26998128c30b1bf1f70e17486a9d315db130852d5e325200.json deleted file mode 100644 index 98238638c1..0000000000 --- a/backend/.sqlx/query-85181656012b18cd26998128c30b1bf1f70e17486a9d315db130852d5e325200.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_3", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "85181656012b18cd26998128c30b1bf1f70e17486a9d315db130852d5e325200" -} diff --git a/backend/.sqlx/query-93586f1ffc7b8dbe62b21a21acfa6854a34a99d2bf107feaafc499588f7330a0.json b/backend/.sqlx/query-93586f1ffc7b8dbe62b21a21acfa6854a34a99d2bf107feaafc499588f7330a0.json deleted file mode 100644 index b4e244e16d..0000000000 --- a/backend/.sqlx/query-93586f1ffc7b8dbe62b21a21acfa6854a34a99d2bf107feaafc499588f7330a0.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS scheduled_root_job", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "93586f1ffc7b8dbe62b21a21acfa6854a34a99d2bf107feaafc499588f7330a0" -} diff --git a/backend/.sqlx/query-cb5a8545ea140ed69c7b70d8c08cb3c037309f09e84acbb7945a0466d6e9f576.json b/backend/.sqlx/query-cb5a8545ea140ed69c7b70d8c08cb3c037309f09e84acbb7945a0466d6e9f576.json deleted file mode 100644 index 27330c2def..0000000000 --- a/backend/.sqlx/query-cb5a8545ea140ed69c7b70d8c08cb3c037309f09e84acbb7945a0466d6e9f576.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "create index concurrently if not exists ix_v2_job_root_by_path\n on v2_job (workspace_id, runnable_path, created_at DESC)\n where parent_job is null", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "cb5a8545ea140ed69c7b70d8c08cb3c037309f09e84acbb7945a0466d6e9f576" -} diff --git a/backend/.sqlx/query-d949e8b91fbdf4c50c1c2cbc608cf0b385bff14faab495e049f2029790f76d25.json b/backend/.sqlx/query-d949e8b91fbdf4c50c1c2cbc608cf0b385bff14faab495e049f2029790f76d25.json deleted file mode 100644 index e792f43ad4..0000000000 --- a/backend/.sqlx/query-d949e8b91fbdf4c50c1c2cbc608cf0b385bff14faab495e049f2029790f76d25.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_9", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "d949e8b91fbdf4c50c1c2cbc608cf0b385bff14faab495e049f2029790f76d25" -} diff --git a/backend/.sqlx/query-e00144305b880cca3994b53c4a080e111a159a749728ce5363100cf883bdf02a.json b/backend/.sqlx/query-e00144305b880cca3994b53c4a080e111a159a749728ce5363100cf883bdf02a.json deleted file mode 100644 index d9fbfef7e2..0000000000 --- a/backend/.sqlx/query-e00144305b880cca3994b53c4a080e111a159a749728ce5363100cf883bdf02a.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_8", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "e00144305b880cca3994b53c4a080e111a159a749728ce5363100cf883bdf02a" -} diff --git a/backend/.sqlx/query-e9038a6fcfd8bdf4855c5919ce634b976cbe0280e7215862aaf5ef445663793d.json b/backend/.sqlx/query-e9038a6fcfd8bdf4855c5919ce634b976cbe0280e7215862aaf5ef445663793d.json deleted file mode 100644 index 13e6880b54..0000000000 --- a/backend/.sqlx/query-e9038a6fcfd8bdf4855c5919ce634b976cbe0280e7215862aaf5ef445663793d.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_7", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "e9038a6fcfd8bdf4855c5919ce634b976cbe0280e7215862aaf5ef445663793d" -} diff --git a/backend/.sqlx/query-ebfd39f168722701fb63cd37aaef3741b9782d8e2d4b6ff6c104fdcac5f58323.json b/backend/.sqlx/query-ebfd39f168722701fb63cd37aaef3741b9782d8e2d4b6ff6c104fdcac5f58323.json deleted file mode 100644 index b82bb5a31c..0000000000 --- a/backend/.sqlx/query-ebfd39f168722701fb63cd37aaef3741b9782d8e2d4b6ff6c104fdcac5f58323.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_created_at", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "ebfd39f168722701fb63cd37aaef3741b9782d8e2d4b6ff6c104fdcac5f58323" -} diff --git a/backend/.sqlx/query-fa94a9ee5514f6808d3813394e62c86a69b7b7378333322a57856f8e43c6cd77.json b/backend/.sqlx/query-fa94a9ee5514f6808d3813394e62c86a69b7b7378333322a57856f8e43c6cd77.json deleted file mode 100644 index 6baa09af23..0000000000 --- a/backend/.sqlx/query-fa94a9ee5514f6808d3813394e62c86a69b7b7378333322a57856f8e43c6cd77.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DROP INDEX CONCURRENTLY IF EXISTS ix_completed_job_workspace_id_created_at_new_5", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "fa94a9ee5514f6808d3813394e62c86a69b7b7378333322a57856f8e43c6cd77" -} diff --git a/backend/.sqlx/query-72f98539ff9874479f6fc0e9f45f55354ad0397356c67a6162249a3cc553f125.json b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json similarity index 74% rename from backend/.sqlx/query-72f98539ff9874479f6fc0e9f45f55354ad0397356c67a6162249a3cc553f125.json rename to backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json index 1f10da84cf..649ab85650 100644 --- a/backend/.sqlx/query-72f98539ff9874479f6fc0e9f45f55354ad0397356c67a6162249a3cc553f125.json +++ b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n workspace.id AS \"id!\",\n workspace.name AS \"name!\",\n workspace.owner AS \"owner!\",\n workspace.deleted AS \"deleted!\",\n workspace.premium AS \"premium!\",\n workspace_settings.color AS \"color!\"\n FROM workspace\n LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id\n LIMIT $1 OFFSET $2", + "query": "SELECT\n workspace.id AS \"id!\",\n workspace.name AS \"name!\",\n workspace.owner AS \"owner!\",\n workspace.deleted AS \"deleted!\",\n workspace.premium AS \"premium!\",\n workspace_settings.color AS \"color\"\n FROM workspace\n LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id\n LIMIT $1 OFFSET $2", "describe": { "columns": [ { @@ -30,7 +30,7 @@ }, { "ordinal": 5, - "name": "color!", + "name": "color", "type_info": "Varchar" } ], @@ -41,13 +41,13 @@ ] }, "nullable": [ - true, - true, - true, - true, - true, + false, + false, + false, + false, + false, true ] }, - "hash": "72f98539ff9874479f6fc0e9f45f55354ad0397356c67a6162249a3cc553f125" + "hash": "fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74" } diff --git a/backend/windmill-api/src/workspaces.rs b/backend/windmill-api/src/workspaces.rs index b2dbb9d2f7..9961caed23 100644 --- a/backend/windmill-api/src/workspaces.rs +++ b/backend/windmill-api/src/workspaces.rs @@ -1410,7 +1410,7 @@ async fn list_workspaces_as_super_admin( workspace.owner AS \"owner!\", workspace.deleted AS \"deleted!\", workspace.premium AS \"premium!\", - workspace_settings.color AS \"color!\" + workspace_settings.color AS \"color\" FROM workspace LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id LIMIT $1 OFFSET $2", From a814024440f6e0862b5aa792d995ab52928863b2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 21:03:04 +0100 Subject: [PATCH 7/9] re-enable RLS on v2_job --- backend/windmill-api/src/db.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index a4c6fe3c72..69bc969a75 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -647,6 +647,12 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { .await?; }); + run_windmill_migration!("v2_jobs_rls", &db, |tx| { + sqlx::query!("ALTER TABLE v2_job ENABLE ROW LEVEL SECURITY") + .execute(db) + .await?; + }); + Ok(()) } From 86d45c61c9b8be5aa5c9c0f8715b98f543146a23 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Feb 2025 21:34:53 +0100 Subject: [PATCH 8/9] fix extra_perms for schedule light --- ...87ee6dbe1380eca532f50bab0cb89a91d42131cf.json | 12 ++++++++++++ backend/windmill-api/src/db.rs | 10 +++++----- backend/windmill-api/src/schedule.rs | 3 ++- frontend/src/lib/components/SharedBadge.svelte | 6 +++--- frontend/src/lib/utils.ts | 16 ++++++++-------- 5 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 backend/.sqlx/query-c458012c39f1327fb2bfd6b087ee6dbe1380eca532f50bab0cb89a91d42131cf.json diff --git a/backend/.sqlx/query-c458012c39f1327fb2bfd6b087ee6dbe1380eca532f50bab0cb89a91d42131cf.json b/backend/.sqlx/query-c458012c39f1327fb2bfd6b087ee6dbe1380eca532f50bab0cb89a91d42131cf.json new file mode 100644 index 0000000000..86f7f8605e --- /dev/null +++ b/backend/.sqlx/query-c458012c39f1327fb2bfd6b087ee6dbe1380eca532f50bab0cb89a91d42131cf.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "ALTER TABLE v2_job ENABLE ROW LEVEL SECURITY", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "c458012c39f1327fb2bfd6b087ee6dbe1380eca532f50bab0cb89a91d42131cf" +} diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index 69bc969a75..2c18248201 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -647,11 +647,11 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { .await?; }); - run_windmill_migration!("v2_jobs_rls", &db, |tx| { - sqlx::query!("ALTER TABLE v2_job ENABLE ROW LEVEL SECURITY") - .execute(db) - .await?; - }); + // run_windmill_migration!("v2_jobs_rls", &db, |tx| { + // sqlx::query!("ALTER TABLE v2_job ENABLE ROW LEVEL SECURITY") + // .execute(db) + // .await?; + // }); Ok(()) } diff --git a/backend/windmill-api/src/schedule.rs b/backend/windmill-api/src/schedule.rs index a6b6abf7dc..6754d5cfba 100644 --- a/backend/windmill-api/src/schedule.rs +++ b/backend/windmill-api/src/schedule.rs @@ -341,6 +341,7 @@ pub struct ScheduleLight { pub script_path: String, pub is_flow: bool, pub summary: Option, + pub extra_perms: serde_json::Value, } async fn list_schedule( authed: ApiAuthed, @@ -351,7 +352,7 @@ async fn list_schedule( let mut tx = user_db.begin(&authed).await?; let (per_page, offset) = paginate(Pagination { per_page: lsq.per_page, page: lsq.page }); let mut sqlb = SqlBuilder::select_from("schedule") - .field("workspace_id, path, edited_by, edited_at, schedule, timezone, enabled, script_path, is_flow, summary") + .field("workspace_id, path, edited_by, edited_at, schedule, timezone, enabled, script_path, is_flow, summary, extra_perms") .order_by("edited_at", true) .and_where("workspace_id = ?".bind(&w_id)) .offset(offset) diff --git a/frontend/src/lib/components/SharedBadge.svelte b/frontend/src/lib/components/SharedBadge.svelte index 9206fc8d2f..e57ac59e1a 100644 --- a/frontend/src/lib/components/SharedBadge.svelte +++ b/frontend/src/lib/components/SharedBadge.svelte @@ -17,17 +17,17 @@ let username = $userStore?.username ?? '' let pgroups = $userStore?.pgroups ?? [] let pusername = `u/${username}` - let extraPermsKeys = Object.keys(extraPerms) + let extraPermsKeys = Object.keys(extraPerms ?? {}) if (pusername in extraPermsKeys) { - if (extraPerms[pusername]) { + if (extraPerms?.[pusername]) { kind = 'write' } else { kind = 'read' } reason = 'This item was shared to you personally' } else { - let writeGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms[x]) + let writeGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms?.[x]) if (writeGroup) { kind = 'write' reason = `This item was write shared to the group ${writeGroup} which you are a member of` diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index e9be17cdd9..71eecc14a3 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -82,9 +82,9 @@ export function displayDate( } const dateChoices: Intl.DateTimeFormatOptions = displayDate ? { - day: 'numeric', - month: 'numeric' - } + day: 'numeric', + month: 'numeric' + } : {} return date.toLocaleString(undefined, { ...timeChoices, @@ -351,7 +351,7 @@ export function removeItemAll(arr: T[], value: T) { } export function emptyString(str: string | undefined | null): boolean { - return str === undefined || str === null || str === '' + return str === undefined || str === null || str === '' } export function emptyStringTrimmed(str: string | undefined | null): boolean { @@ -705,7 +705,7 @@ export function canWrite( if (user?.is_admin || user?.is_super_admin) { return true } - let keys = Object.keys(extra_perms) + let keys = Object.keys(extra_perms ?? {}) if (!user) { return false } @@ -713,10 +713,10 @@ export function canWrite( return true } let userOwner = `u/${user.username}` - if (keys.includes(userOwner) && extra_perms[userOwner]) { + if (keys.includes(userOwner) && extra_perms?.[userOwner]) { return true } - if (user.pgroups.findIndex((x) => keys.includes(x) && extra_perms[x]) != -1) { + if (user.pgroups.findIndex((x) => keys.includes(x) && extra_perms?.[x]) != -1) { return true } if (user.folders.findIndex((x) => path.startsWith('f/' + x + '/') && user.folders[x]) != -1) { @@ -846,7 +846,7 @@ export async function tryEvery({ try { await tryCode() break - } catch (err) {} + } catch (err) { } i++ } if (i >= times) { From 2ea3bdec2d7a65f8ceeea84f9e677fb4d2c5e0f3 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 13 Feb 2025 16:24:48 -0500 Subject: [PATCH 9/9] fix: populate teams channel on initial load (#5284) --- .../src/lib/components/InstanceSetting.svelte | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib/components/InstanceSetting.svelte b/frontend/src/lib/components/InstanceSetting.svelte index 3081fcd36d..599ca28229 100644 --- a/frontend/src/lib/components/InstanceSetting.svelte +++ b/frontend/src/lib/components/InstanceSetting.svelte @@ -422,6 +422,9 @@ [e.target['value']]: '' } } + if (e.target?.['value'] === 'teams_channel') { + fetchTeams() + } }} value={(() => { if (!v) return 'email' @@ -456,15 +459,17 @@ selected={!$values['critical_error_channels'][i]?.teams_channel ?.team_id}>Select team - {#each $values['teams'] as team} - - {/each} + {#if $values['teams']} + {#each $values['teams'] as team} + + {/each} + {/if} {#if $values['critical_error_channels'][i]?.teams_channel?.team_id}