diff --git a/backend/.sqlx/query-29510e633e79d63ec28e8cf0ea5e7c0de3f9874cb4de0945b9b11eb988c5deb6.json b/backend/.sqlx/query-29510e633e79d63ec28e8cf0ea5e7c0de3f9874cb4de0945b9b11eb988c5deb6.json new file mode 100644 index 0000000000..2289e91c83 --- /dev/null +++ b/backend/.sqlx/query-29510e633e79d63ec28e8cf0ea5e7c0de3f9874cb4de0945b9b11eb988c5deb6.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_queue SET workspace_id = $1\n WHERE id IN (\n SELECT id FROM v2_job_queue\n WHERE workspace_id = $2\n AND running = false\n AND id IN (SELECT id FROM v2_job WHERE workspace_id = $2 AND parent_job IS NULL)\n FOR UPDATE SKIP LOCKED\n )", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "29510e633e79d63ec28e8cf0ea5e7c0de3f9874cb4de0945b9b11eb988c5deb6" +} diff --git a/backend/.sqlx/query-0ea5ba568ec0f62b808fe938a41174646b6bdd658b8461db1bb90a871d076718.json b/backend/.sqlx/query-35c7c7dd9c9887307dfa4288ef391ae9068080afa2de9b234332e91e16748060.json similarity index 57% rename from backend/.sqlx/query-0ea5ba568ec0f62b808fe938a41174646b6bdd658b8461db1bb90a871d076718.json rename to backend/.sqlx/query-35c7c7dd9c9887307dfa4288ef391ae9068080afa2de9b234332e91e16748060.json index 19fe394067..57d6430b35 100644 --- a/backend/.sqlx/query-0ea5ba568ec0f62b808fe938a41174646b6bdd658b8461db1bb90a871d076718.json +++ b/backend/.sqlx/query-35c7c7dd9c9887307dfa4288ef391ae9068080afa2de9b234332e91e16748060.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE v2_job_queue SET workspace_id = $1 WHERE workspace_id = $2", + "query": "UPDATE mqtt_trigger SET workspace_id = $1 WHERE workspace_id = $2", "describe": { "columns": [], "parameters": { @@ -11,5 +11,5 @@ }, "nullable": [] }, - "hash": "0ea5ba568ec0f62b808fe938a41174646b6bdd658b8461db1bb90a871d076718" + "hash": "35c7c7dd9c9887307dfa4288ef391ae9068080afa2de9b234332e91e16748060" } diff --git a/backend/.sqlx/query-4244640e62fffb0f6978f8f7d78291b3294a6a7d1549d752f14acf5972552ba5.json b/backend/.sqlx/query-380d2ef1082d8eb0847d24a24733ddfb6864384c3beb859ef0b4b3c2ce982837.json similarity index 52% rename from backend/.sqlx/query-4244640e62fffb0f6978f8f7d78291b3294a6a7d1549d752f14acf5972552ba5.json rename to backend/.sqlx/query-380d2ef1082d8eb0847d24a24733ddfb6864384c3beb859ef0b4b3c2ce982837.json index 841d549e20..44fcc67822 100644 --- a/backend/.sqlx/query-4244640e62fffb0f6978f8f7d78291b3294a6a7d1549d752f14acf5972552ba5.json +++ b/backend/.sqlx/query-380d2ef1082d8eb0847d24a24733ddfb6864384c3beb859ef0b4b3c2ce982837.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE v2_job SET workspace_id = $1 WHERE workspace_id = $2", + "query": "UPDATE sqs_trigger SET workspace_id = $1 WHERE workspace_id = $2", "describe": { "columns": [], "parameters": { @@ -11,5 +11,5 @@ }, "nullable": [] }, - "hash": "4244640e62fffb0f6978f8f7d78291b3294a6a7d1549d752f14acf5972552ba5" + "hash": "380d2ef1082d8eb0847d24a24733ddfb6864384c3beb859ef0b4b3c2ce982837" } diff --git a/backend/.sqlx/query-64c01fc19684ae289a6cd57398effe91f4c8a575d8f60381125f09ab5789cbed.json b/backend/.sqlx/query-64c01fc19684ae289a6cd57398effe91f4c8a575d8f60381125f09ab5789cbed.json new file mode 100644 index 0000000000..e08d61679d --- /dev/null +++ b/backend/.sqlx/query-64c01fc19684ae289a6cd57398effe91f4c8a575d8f60381125f09ab5789cbed.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE gcp_trigger SET workspace_id = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "64c01fc19684ae289a6cd57398effe91f4c8a575d8f60381125f09ab5789cbed" +} diff --git a/backend/.sqlx/query-e2f7a1a48bb026df5c7155b76e166cd5a6ca2ab25926f70095328d5ea2d2bc7c.json b/backend/.sqlx/query-e2f7a1a48bb026df5c7155b76e166cd5a6ca2ab25926f70095328d5ea2d2bc7c.json new file mode 100644 index 0000000000..17b075d382 --- /dev/null +++ b/backend/.sqlx/query-e2f7a1a48bb026df5c7155b76e166cd5a6ca2ab25926f70095328d5ea2d2bc7c.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job SET workspace_id = $1\n WHERE workspace_id = $2\n AND (id IN (SELECT id FROM v2_job_queue WHERE workspace_id = $1)\n OR id IN (SELECT id FROM v2_job_completed WHERE workspace_id = $1))", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "e2f7a1a48bb026df5c7155b76e166cd5a6ca2ab25926f70095328d5ea2d2bc7c" +} diff --git a/backend/.sqlx/query-e9550a157d2914787c7741dbc4568a16542c598b029f0f7e97882cb12d5cbad1.json b/backend/.sqlx/query-e9550a157d2914787c7741dbc4568a16542c598b029f0f7e97882cb12d5cbad1.json new file mode 100644 index 0000000000..fd97595279 --- /dev/null +++ b/backend/.sqlx/query-e9550a157d2914787c7741dbc4568a16542c598b029f0f7e97882cb12d5cbad1.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE postgres_trigger SET workspace_id = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "e9550a157d2914787c7741dbc4568a16542c598b029f0f7e97882cb12d5cbad1" +} diff --git a/backend/.sqlx/query-f863cb7ec416d774dc4c8170b2f5ec974b035405da38bf3e7764f7e22232b760.json b/backend/.sqlx/query-f863cb7ec416d774dc4c8170b2f5ec974b035405da38bf3e7764f7e22232b760.json new file mode 100644 index 0000000000..110b4035db --- /dev/null +++ b/backend/.sqlx/query-f863cb7ec416d774dc4c8170b2f5ec974b035405da38bf3e7764f7e22232b760.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COUNT(*) FROM v2_job WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f863cb7ec416d774dc4c8170b2f5ec974b035405da38bf3e7764f7e22232b760" +} diff --git a/backend/windmill-api/src/workspaces_extra.rs b/backend/windmill-api/src/workspaces_extra.rs index ca4f9db6a7..6d631d8bae 100644 --- a/backend/windmill-api/src/workspaces_extra.rs +++ b/backend/windmill-api/src/workspaces_extra.rs @@ -47,6 +47,24 @@ pub(crate) async fn change_workspace_id( require_admin(authed.is_admin, &authed.username)?; } + // Check total job count before attempting migration + let job_count = sqlx::query_scalar!( + "SELECT COUNT(*) FROM v2_job WHERE workspace_id = $1", + &old_id + ) + .fetch_one(&db) + .await? + .unwrap_or(0); + + if job_count > 100_000 { + return Err(Error::BadRequest( + format!( + "Workspace has {} jobs which exceeds the 100k limit for direct migration. Please use the Windmill CLI to migrate jobs instead: `wmill jobs pull/push`.", + job_count + ) + )); + } + let mut tx = db.begin().await?; check_w_id_conflict(&mut tx, &rw.new_id).await?; @@ -133,6 +151,38 @@ pub(crate) async fn change_workspace_id( .execute(&mut *tx) .await?; + sqlx::query!( + "UPDATE postgres_trigger SET workspace_id = $1 WHERE workspace_id = $2", + &rw.new_id, + &old_id + ) + .execute(&mut *tx) + .await?; + + sqlx::query!( + "UPDATE mqtt_trigger SET workspace_id = $1 WHERE workspace_id = $2", + &rw.new_id, + &old_id + ) + .execute(&mut *tx) + .await?; + + sqlx::query!( + "UPDATE gcp_trigger SET workspace_id = $1 WHERE workspace_id = $2", + &rw.new_id, + &old_id + ) + .execute(&mut *tx) + .await?; + + sqlx::query!( + "UPDATE sqs_trigger SET workspace_id = $1 WHERE workspace_id = $2", + &rw.new_id, + &old_id + ) + .execute(&mut *tx) + .await?; + sqlx::query!( "UPDATE v2_job_completed SET workspace_id = $1 WHERE workspace_id = $2", &rw.new_id, @@ -275,7 +325,14 @@ pub(crate) async fn change_workspace_id( .await?; sqlx::query!( - "UPDATE v2_job_queue SET workspace_id = $1 WHERE workspace_id = $2", + "UPDATE v2_job_queue SET workspace_id = $1 + WHERE id IN ( + SELECT id FROM v2_job_queue + WHERE workspace_id = $2 + AND running = false + AND id IN (SELECT id FROM v2_job WHERE workspace_id = $2 AND parent_job IS NULL) + FOR UPDATE SKIP LOCKED + )", &rw.new_id, &old_id ) @@ -283,7 +340,10 @@ pub(crate) async fn change_workspace_id( .await?; sqlx::query!( - "UPDATE v2_job SET workspace_id = $1 WHERE workspace_id = $2", + "UPDATE v2_job SET workspace_id = $1 + WHERE workspace_id = $2 + AND (id IN (SELECT id FROM v2_job_queue WHERE workspace_id = $1) + OR id IN (SELECT id FROM v2_job_completed WHERE workspace_id = $1))", &rw.new_id, &old_id ) diff --git a/frontend/src/lib/components/settings/ChangeWorkspaceId.svelte b/frontend/src/lib/components/settings/ChangeWorkspaceId.svelte index d1dd4eaac1..17af87fd8d 100644 --- a/frontend/src/lib/components/settings/ChangeWorkspaceId.svelte +++ b/frontend/src/lib/components/settings/ChangeWorkspaceId.svelte @@ -80,9 +80,12 @@
- - Renaming the workspace may take a few minutes to complete. Once finished, please update your - webhook calls and adjust your CLI sync configuration accordingly. + + Once finished, please update your webhook calls and adjust your CLI sync configuration + accordingly. + + + Make sure that all your jobs are completed before changing the workspace ID.

Current ID
{$workspaceStore ?? ''}