fix: make workspace id change faster and add 100k jobs limit (#7500)

This commit is contained in:
hugocasa
2026-01-07 01:07:51 +07:00
committed by GitHub
parent 69b44f3b68
commit cf90bd4676
9 changed files with 154 additions and 9 deletions
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
+62 -2
View File
@@ -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
)
@@ -80,9 +80,12 @@
<Modal bind:open title="Change workspace ID">
<div class="flex flex-col gap-4">
<Alert type="warning" title="Warning">
Renaming the workspace may take a few minutes to complete. Once finished, please update your
webhook calls and adjust your CLI sync configuration accordingly.
<Alert type="info" title="Changing the workspace ID may take a few minutes to complete">
Once finished, please update your webhook calls and adjust your CLI sync configuration
accordingly.
</Alert>
<Alert type="warning" title="Running jobs and queued flow steps will not be migrated.">
Make sure that all your jobs are completed before changing the workspace ID.
</Alert>
<p class="text-secondary text-xs"
>Current ID <br /> <span class="text-emphasis">{$workspaceStore ?? ''}</span></p