Merge branch 'main' into perf-since-arg-historic-inputs

This commit is contained in:
pyranota
2025-02-17 23:54:32 +03:00
committed by GitHub
33 changed files with 266 additions and 139 deletions
+21
View File
@@ -1,5 +1,26 @@
# Changelog
## [1.463.3](https://github.com/windmill-labs/windmill/compare/v1.463.2...v1.463.3) (2025-02-17)
### Bug Fixes
* windmill_admin has implicit bypass rls on v2_job even if role not set ([0208f53](https://github.com/windmill-labs/windmill/commit/0208f53541473aa51bed0e15d938def3d4530e3f))
## [1.463.2](https://github.com/windmill-labs/windmill/compare/v1.463.1...v1.463.2) (2025-02-16)
### Bug Fixes
* show skipped flows as success ([#5304](https://github.com/windmill-labs/windmill/issues/5304)) ([062e6bc](https://github.com/windmill-labs/windmill/commit/062e6bc161b56215cb081209d37ad8e0cbd1dd99))
## [1.463.1](https://github.com/windmill-labs/windmill/compare/v1.463.0...v1.463.1) (2025-02-15)
### Bug Fixes
* not able to filter runs by schedule ([#5302](https://github.com/windmill-labs/windmill/issues/5302)) ([53f47bc](https://github.com/windmill-labs/windmill/commit/53f47bcfc84ed747b55d3a7d84ccf13ff1c43c97))
## [1.463.0](https://github.com/windmill-labs/windmill/compare/v1.462.1...v1.463.0) (2025-02-14)
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now()",
"query": "SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now() AND ($3::text[] IS NULL OR tag = ANY($3))",
"describe": {
"columns": [
{
@@ -17,7 +17,8 @@
"parameters": {
"Left": [
"Text",
"Bool"
"Bool",
"TextArray"
]
},
"nullable": [
@@ -25,5 +26,5 @@
null
]
},
"hash": "19cc8499f682ec34d54bc4f694cb281a9bd7f5431c646c6268513751fff95395"
"hash": "0cb0e912bc942af2b1ef784455f3f073a79e300f3dd48f14122d1782eee663cd"
}
@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS queue_sort",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "0efb16cbf130ec6e9922ecc82a95b252449bd569df374e40ce8820fc3d75a0f0"
}
@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS queue_sort_2",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "3738096c29ab9d964be8a74bfd14ff1d599049ebefdaf97a017c9cef8d52ce20"
}
@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "CREATE INDEX CONCURRENTLY queue_sort_v2 ON v2_job_queue (priority DESC NULLS LAST, scheduled_for, tag) WHERE running = false",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "3bbde0fa35d935ec2dd8bd1fb14cfecf48305f5f4b644b3c35355074e1ccce28"
}
@@ -1,12 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "VACUUM (skip_locked) v2_job_queue, v2_job_runtime, v2_job_status",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "47455b0ebaf999ab58b2cba3d74cb4bdd64075939a4aa2c117e18372511ea7e0"
}
@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "VACUUM v2_job_queue, v2_job_runtime, v2_job_status",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "b9b38d63af3670d1f11d5cbb82a8008a9479bf4b3d7231371ebf26382ecde365"
}
+48 -48
View File
@@ -3209,9 +3209,9 @@ dependencies = [
[[package]]
name = "equivalent"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
@@ -5776,9 +5776,9 @@ dependencies = [
[[package]]
name = "openssl"
version = "0.10.70"
version = "0.10.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6"
checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
dependencies = [
"bitflags 2.8.0",
"cfg-if",
@@ -5817,9 +5817,9 @@ dependencies = [
[[package]]
name = "openssl-sys"
version = "0.9.105"
version = "0.9.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc"
checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
dependencies = [
"cc",
"libc",
@@ -6795,8 +6795,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.0",
"zerocopy 0.8.17",
"rand_core 0.9.1",
"zerocopy 0.8.18",
]
[[package]]
@@ -6826,7 +6826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.0",
"rand_core 0.9.1",
]
[[package]]
@@ -6849,12 +6849,12 @@ dependencies = [
[[package]]
name = "rand_core"
version = "0.9.0"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff"
checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3"
dependencies = [
"getrandom 0.3.1",
"zerocopy 0.8.17",
"zerocopy 0.8.18",
]
[[package]]
@@ -7575,9 +7575,9 @@ checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "ryu-js"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad97d4ce1560a5e27cec89519dc8300d1aa6035b099821261c651486a19e44d5"
checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15"
[[package]]
name = "safetensors"
@@ -8150,9 +8150,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.13.2"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
dependencies = [
"serde",
]
@@ -9297,9 +9297,9 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.16.0"
version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
checksum = "a40f762a77d2afa88c2d919489e390a12bdd261ed568e60cfa7e48d4e20f0d33"
dependencies = [
"cfg-if",
"fastrand 2.3.0",
@@ -10858,7 +10858,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windmill"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"axum",
@@ -10901,7 +10901,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"argon2",
@@ -10995,7 +10995,7 @@ dependencies = [
[[package]]
name = "windmill-api-client"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"base64 0.22.1",
"chrono",
@@ -11013,7 +11013,7 @@ dependencies = [
[[package]]
name = "windmill-audit"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"chrono",
"serde",
@@ -11026,7 +11026,7 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"serde",
@@ -11040,7 +11040,7 @@ dependencies = [
[[package]]
name = "windmill-common"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"async-stream",
@@ -11099,7 +11099,7 @@ dependencies = [
[[package]]
name = "windmill-git-sync"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"regex",
"serde",
@@ -11113,7 +11113,7 @@ dependencies = [
[[package]]
name = "windmill-indexer"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"bytes",
@@ -11136,7 +11136,7 @@ dependencies = [
[[package]]
name = "windmill-macros"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"itertools 0.14.0",
"lazy_static",
@@ -11148,7 +11148,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -11157,7 +11157,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"lazy_static",
@@ -11169,7 +11169,7 @@ dependencies = [
[[package]]
name = "windmill-parser-csharp"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"serde_json",
@@ -11181,7 +11181,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"gosyn",
@@ -11193,7 +11193,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"lazy_static",
@@ -11205,7 +11205,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11216,7 +11216,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11227,7 +11227,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"async-recursion",
@@ -11247,7 +11247,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -11264,7 +11264,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"lazy_static",
@@ -11276,7 +11276,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"lazy_static",
@@ -11294,7 +11294,7 @@ dependencies = [
[[package]]
name = "windmill-parser-wasm"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"getrandom 0.2.15",
@@ -11316,7 +11316,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"serde_json",
@@ -11326,7 +11326,7 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"async-recursion",
@@ -11359,7 +11359,7 @@ dependencies = [
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"wasm-bindgen",
"wasm-bindgen-test",
@@ -11369,7 +11369,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.463.0"
version = "1.463.3"
dependencies = [
"anyhow",
"async-recursion",
@@ -11783,11 +11783,11 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.17"
version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713"
checksum = "79386d31a42a4996e3336b0919ddb90f81112af416270cff95b5f5af22b839c2"
dependencies = [
"zerocopy-derive 0.8.17",
"zerocopy-derive 0.8.18",
]
[[package]]
@@ -11803,9 +11803,9 @@ dependencies = [
[[package]]
name = "zerocopy-derive"
version = "0.8.17"
version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626"
checksum = "76331675d372f91bf8d17e13afbd5fe639200b73d01f0fc748bb059f9cca2db7"
dependencies = [
"proc-macro2",
"quote",
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.463.0"
version = "1.463.3"
authors.workspace = true
edition.workspace = true
@@ -30,7 +30,7 @@ members = [
]
[workspace.package]
version = "1.463.0"
version = "1.463.3"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
@@ -0,0 +1 @@
-- Add down migration script here
@@ -0,0 +1,3 @@
-- Add up migration script here
DROP POLICY IF EXISTS admin_policy ON v2_job;
CREATE POLICY admin_policy ON v2_job FOR ALL TO windmill_admin USING (true);
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.463.0
version: 1.463.3
title: Windmill API
contact:
+17
View File
@@ -655,6 +655,23 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> {
.await?;
});
run_windmill_migration!("v2_improve_v2_queued_jobs_indices", &db, |tx| {
sqlx::query!("CREATE INDEX CONCURRENTLY queue_sort_v2 ON v2_job_queue (priority DESC NULLS LAST, scheduled_for, tag) WHERE running = false")
.execute(db)
.await?;
// sqlx::query!("CREATE INDEX CONCURRENTLY queue_sort_2_v2 ON v2_job_queue (tag, priority DESC NULLS LAST, scheduled_for) WHERE running = false")
// .execute(db)
// .await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS queue_sort")
.execute(db)
.await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS queue_sort_2")
.execute(db)
.await?;
});
Ok(())
}
+15 -7
View File
@@ -1161,7 +1161,7 @@ pub struct ListableCompletedJob {
pub parent_job: Option<Uuid>,
pub created_by: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub started_at: chrono::DateTime<chrono::Utc>,
pub started_at: Option<chrono::DateTime<chrono::Utc>>,
pub duration_ms: i64,
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -1319,7 +1319,7 @@ pub fn filter_list_queue_query(
}
if let Some(p) = &lq.schedule_path {
sqlb.and_where_eq("trigger", "?".bind(p));
sqlb.and_where_eq("trigger_kind", "schedule");
sqlb.and_where_eq("trigger_kind", "'schedule'");
}
if let Some(h) = &lq.script_hash {
sqlb.and_where_eq("runnable_id", "?".bind(h));
@@ -1647,6 +1647,7 @@ struct QueueStats {
#[derive(Deserialize)]
pub struct CountQueueJobsQuery {
all_workspaces: Option<bool>,
tags: Option<String>,
}
async fn count_queue_jobs(
@@ -1654,12 +1655,16 @@ async fn count_queue_jobs(
Path(w_id): Path<String>,
Query(cq): Query<CountQueueJobsQuery>,
) -> error::JsonResult<QueueStats> {
let tags = cq
.tags
.map(|t| t.split(',').map(|s| s.to_string()).collect::<Vec<_>>());
Ok(Json(
sqlx::query_as!(
QueueStats,
"SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now()",
"SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now() AND ($3::text[] IS NULL OR tag = ANY($3))",
w_id,
w_id == "admins" && cq.all_workspaces.unwrap_or(false),
tags.as_ref().map(|v| v.as_slice())
)
.fetch_one(&db)
.await?,
@@ -1800,13 +1805,13 @@ async fn list_jobs(
}
sqlc.unwrap().limit(per_page).offset(offset).query()?
};
let mut tx = user_db.begin(&authed).await?;
let mut tx: Transaction<'_, Postgres> = user_db.begin(&authed).await?;
#[cfg(feature = "prometheus")]
let start = Instant::now();
#[cfg(feature = "prometheus")]
if _api_list_jobs_query_duration.is_some() {
if _api_list_jobs_query_duration.is_some() || true {
tracing::info!("list_jobs query: {}", sql);
}
@@ -2681,7 +2686,7 @@ const CJ_FIELDS: &[&str] = &[
"v2_job.runnable_path as script_path",
"null as args",
"v2_job_completed.duration_ms",
"v2_job_completed.status = 'success' as success",
"v2_job_completed.status = 'success' OR v2_job_completed.status = 'skipped' as success",
"false as deleted",
"v2_job_completed.status = 'canceled' as canceled",
"v2_job_completed.canceled_by",
@@ -4695,6 +4700,7 @@ struct BatchInfo {
flow_value: Option<FlowValue>,
path: Option<String>,
rawscript: Option<BatchRawScript>,
tag: Option<String>,
}
#[tracing::instrument(level = "trace", skip_all)]
@@ -4863,6 +4869,8 @@ async fn add_batch_jobs(
} else {
format!("{}", language.as_str())
}
} else if let Some(tag) = batch_info.tag {
tag
} else {
format!("{}", language.as_str())
};
@@ -5472,7 +5480,7 @@ async fn list_completed_jobs(
"v2_job.created_at",
"v2_job_completed.started_at",
"v2_job_completed.duration_ms",
"v2_job_completed.status = 'success' as success",
"v2_job_completed.status = 'success' OR v2_job_completed.status = 'skipped' as success",
"v2_job.runnable_id as script_hash",
"v2_job.runnable_path as script_path",
"false as deleted",
+13 -13
View File
@@ -281,7 +281,7 @@ pub async fn connect_db(
pub async fn connect(
database_url: &str,
max_connections: u32,
worker_mode: bool,
_worker_mode: bool,
) -> Result<sqlx::Pool<sqlx::Postgres>, error::Error> {
use std::time::Duration;
@@ -289,18 +289,18 @@ pub async fn connect(
.min_connections((max_connections / 5).clamp(3, max_connections))
.max_connections(max_connections)
.max_lifetime(Duration::from_secs(30 * 60)) // 30 mins
.after_connect(move |conn, _| {
if worker_mode {
Box::pin(async move {
sqlx::query("SET enable_seqscan = OFF;")
.execute(conn)
.await?;
Ok(())
})
} else {
Box::pin(async move { Ok(()) })
}
})
// .after_connect(move |conn, _| {
// if worker_mode {
// Box::pin(async move {
// // sqlx::query("SET enable_seqscan = OFF;")
// // .execute(conn)
// // .await?;
// Ok(())
// })
// } else {
// Box::pin(async move { Ok(()) })
// }
// })
.connect_with(
sqlx::postgres::PgConnectOptions::from_str(database_url)?.statement_cache_capacity(400),
)
+5 -2
View File
@@ -47,8 +47,11 @@ lazy_static::lazy_static! {
.connect_timeout(std::time::Duration::from_secs(10))
.build().unwrap();
pub static ref GIT_SEM_VERSION: Version = Version::parse(
// skip first `v` character.
GIT_VERSION.split_at(1).1
if GIT_VERSION.starts_with('v') {
&GIT_VERSION[1..]
} else {
GIT_VERSION
}
).unwrap_or(Version::new(0, 1, 0));
}
+1 -1
View File
@@ -657,7 +657,7 @@ pub async fn update_min_version<'c, E: sqlx::Executor<'c, Database = sqlx::Postg
let min_version = pings
.iter()
.filter(|x| !x.is_empty())
.filter_map(|x| semver::Version::parse(x.split_at(1).1).ok())
.filter_map(|x| semver::Version::parse(if x.starts_with('v') { &x[1..] } else { x }).ok())
.min()
.unwrap_or_else(|| cur_version.clone());
+3
View File
@@ -2108,12 +2108,15 @@ async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>(
for query in queries.iter() {
// tracing::info!("Pulling job with query: {}", query);
// let instant = std::time::Instant::now();
let r = sqlx::query_as::<_, PulledJob>(query)
.bind(worker_name)
.fetch_optional(db)
.await?;
if let Some(pulled_job) = r {
// tracing::info!("pulled job: {:?}", instant.elapsed().as_micros());
highest_priority_job = Some(pulled_job);
break;
}
+1 -1
View File
@@ -1277,7 +1277,7 @@ pub async fn run_worker(
tokio::task::spawn(
(async move {
tracing::info!(worker = %worker_name, hostname = %hostname, "vacuuming queue");
if let Err(e) = sqlx::query!("VACUUM (skip_locked) v2_job_queue, v2_job_runtime, v2_job_status")
if let Err(e) = sqlx::query!("VACUUM v2_job_queue, v2_job_runtime, v2_job_status")
.execute(&db2)
.await
{
+58 -22
View File
@@ -26,7 +26,7 @@ async function verifyOutputs(uuids: string[], workspace: string) {
incorrectResults++;
}
if (job.result !== uuid) {
console.log(`Job ${uuid} did not output the correct value`);
console.log(`Job ${uuid} did not output the correct value: ${JSON.stringify(job.result)}`);
incorrectResults++;
}
} catch (_) {
@@ -37,6 +37,7 @@ async function verifyOutputs(uuids: string[], workspace: string) {
console.log(`Incorrect results: ${incorrectResults}`);
}
export const NON_TEST_TAGS = ["deno", "python", "go", "bash", "dedicated", "bun", "nativets", "flow"]
export async function main({
host,
email,
@@ -96,11 +97,11 @@ export async function main({
windmill.setClient(final_token, host);
const enc = (s: string) => new TextEncoder().encode(s);
async function getQueueCount() {
async function getQueueCount(tags?: string[]) {
return (
await (
await fetch(
config.server + "/api/w/" + config.workspace_id + "/jobs/queue/count",
config.server + "/api/w/" + config.workspace_id + "/jobs/queue/count" + (tags && tags.length > 0 ? "?tags=" + tags.join(",") : ""),
{ headers: { ["Authorization"]: "Bearer " + config.token } }
)
).json()
@@ -132,11 +133,11 @@ export async function main({
}
let pastJobs = 0;
async function getCompletedJobsCount(): Promise<number> {
async function getCompletedJobsCount(tags?: string[]): Promise<number> {
const completedJobs = (
await (
await fetch(
host + "/api/w/" + config.workspace_id + "/jobs/completed/count",
host + "/api/w/" + config.workspace_id + "/jobs/completed/count" + (tags && tags.length > 0 ? "?tags=" + tags.join(",") : ""),
{ headers: { ["Authorization"]: "Bearer " + config.token } }
)
).json()
@@ -152,7 +153,6 @@ export async function main({
await createBenchScript(kind, workspace);
}
pastJobs = await getCompletedJobsCount();
const jobsSent = jobs;
console.log(`Bulk creating ${jobsSent} jobs`);
@@ -208,11 +208,44 @@ export async function main({
throw new Error("Unknown script pattern " + kind);
}
const response = await fetch(
config.server +
let testOtherTag = false;
if (testOtherTag) {
const otherTagTodo = 2000000;
let parsed = JSON.parse(body);
parsed.tag = "test";
let nbody = JSON.stringify(parsed);
let response2 = await fetch(
config.server +
"/api/w/" +
config.workspace_id +
`/jobs/add_batch_jobs/${jobsSent}`,
`/jobs/add_batch_jobs/${otherTagTodo}`,
{
method: "POST",
headers: {
["Authorization"]: "Bearer " + config.token,
"Content-Type": "application/json",
},
body: nbody,
}
);
if (!response2.ok) {
throw new Error(
"Failed to create jobs: " +
response2.statusText +
" " +
(await response2.text())
);
}
}
pastJobs = await getCompletedJobsCount(NON_TEST_TAGS);
const response = await fetch(
config.server +
"/api/w/" +
config.workspace_id +
`/jobs/add_batch_jobs/${jobsSent}`,
{
method: "POST",
headers: {
@@ -222,20 +255,24 @@ export async function main({
body,
}
);
if (!response.ok) {
throw new Error(
"Failed to create jobs: " +
response.statusText +
" " +
(await response.text())
response.statusText +
" " +
(await response.text())
);
}
const uuids = await response.json();
const end_create = Date.now();
const create_duration = end_create - start_create;
console.log(
`Jobs successfully added to the queue in ${
create_duration / 1000
`Jobs successfully added to the queue in ${create_duration / 1000
}s. Windmill will start pulling them\n`
);
let start = Date.now();
@@ -248,14 +285,14 @@ export async function main({
while (completedJobs < jobsSent) {
const loopStart = Date.now();
if (!didStart) {
const actual_queue = await getQueueCount();
const actual_queue = await getQueueCount(NON_TEST_TAGS);
if (actual_queue < jobsSent) {
start = Date.now();
didStart = true;
}
} else {
const elapsed = start ? Date.now() - start : 0;
completedJobs = await getCompletedJobsCount();
completedJobs = await getCompletedJobsCount(NON_TEST_TAGS);
if (nStepsFlow > 0) {
completedJobs = Math.floor(completedJobs / (nStepsFlow + 1));
}
@@ -263,9 +300,9 @@ export async function main({
const instThr =
lastElapsed > 0
? (
((completedJobs - lastCompletedJobs) / (elapsed - lastElapsed)) *
1000
).toFixed(2)
((completedJobs - lastCompletedJobs) / (elapsed - lastElapsed)) *
1000
).toFixed(2)
: 0;
lastElapsed = elapsed;
@@ -275,8 +312,7 @@ export async function main({
enc(
`elapsed: ${(elapsed / 1000).toFixed(
2
)} | jobs executed: ${completedJobs}/${jobsSent} (thr: inst ${instThr} - avg ${avgThr}) | remaining: ${
jobsSent - completedJobs
)} | jobs executed: ${completedJobs}/${jobsSent} (thr: inst ${instThr} - avg ${avgThr}) | remaining: ${jobsSent - completedJobs
} \r`
)
);
@@ -294,7 +330,7 @@ export async function main({
console.log(`avg. throughput (jobs/time): ${jobsSent / total_duration_sec}`);
console.log("completed jobs", completedJobs);
console.log("queue length:", await getQueueCount());
console.log("queue length:", await getQueueCount(NON_TEST_TAGS));
if (
!noVerify &&
+1 -1
View File
@@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts";
import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts";
import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts";
export const VERSION = "v1.463.0";
export const VERSION = "v1.463.3";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({
+1 -1
View File
@@ -62,7 +62,7 @@ export {
// }
// });
export const VERSION = "1.463.0";
export const VERSION = "1.463.3";
const command = new Command()
.name("wmill")
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "windmill-components",
"version": "1.463.0",
"version": "1.463.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
"version": "1.463.0",
"version": "1.463.3",
"license": "AGPL-3.0",
"dependencies": {
"@anthropic-ai/sdk": "^0.32.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "windmill-components",
"version": "1.463.0",
"version": "1.463.3",
"scripts": {
"dev": "vite dev",
"build": "vite build",
@@ -447,11 +447,14 @@
if (emptyString($enterpriseLicense)) {
errorHandlerSelected = 'custom'
} else {
errorHandlerSelected =
emptyString(errorHandlerScriptPath) ? 'custom' :
(errorHandlerScriptPath.startsWith('hub/') && errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-slack')) ? 'slack' :
(errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-teams')) ? 'teams' :
'custom'
errorHandlerSelected = emptyString(errorHandlerScriptPath)
? 'custom'
: errorHandlerScriptPath.startsWith('hub/') &&
errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-slack')
? 'slack'
: errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-teams')
? 'teams'
: 'custom'
}
errorHandlerExtraArgs = settings.error_handler_extra_args ?? {}
workspaceDefaultAppPath = settings.default_app
@@ -812,8 +815,8 @@
{#if !$enterpriseLicense}
<div class="pt-4" />
<Alert type="info" title="Workspace Teams commands is an EE feature">
Workspace Teams commands is a Windmill EE feature. It enables using your current Slack / Teams
connection to run a custom script and send notifications.
Workspace Teams commands is a Windmill EE feature. It enables using your current Slack
/ Teams connection to run a custom script and send notifications.
</Alert>
<div class="pb-2" />
{/if}
@@ -867,12 +870,7 @@
<div class="mt-20" />
<PageHeader title="Delete workspace" primary={false} />
{#if $superadmin}
<p class="italic text-xs">
When deleting the workspace, it will be archived for a short period of time and then
permanently deleted.
</p>
{:else}
{#if !$superadmin}
<p class="italic text-xs"> Only instance superadmins can delete a workspace. </p>
{/if}
{#if $workspaceStore === 'admins' || $workspaceStore === 'starter'}
+2 -2
View File
@@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi"
[packages]
wmill = ">=1.463.0"
wmill_pg = ">=1.463.0"
wmill = ">=1.463.3"
wmill_pg = ">=1.463.3"
sendgrid = "*"
mysql-connector-python = "*"
pymongo = "*"
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.463.0
version: 1.463.3
title: OpenFlow Spec
contact:
name: Ruben Fiszel
@@ -12,7 +12,7 @@
RootModule = 'WindmillClient.psm1'
# Version number of this module.
ModuleVersion = '1.463.0'
ModuleVersion = '1.463.3'
# Supported PSEditions
# CompatiblePSEditions = @()
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.463.0"
version = "1.463.3"
description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill-pg"
version = "1.463.0"
version = "1.463.3"
description = "An extension client for the wmill client library focused on pg"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@windmill/windmill",
"version": "1.463.0",
"version": "1.463.3",
"exports": "./src/index.ts",
"publish": {
"exclude": ["!src", "./s3Types.ts", "./client.ts"]
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "windmill-client",
"description": "Windmill SDK client for browsers and Node.js",
"version": "1.463.0",
"version": "1.463.3",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"devDependencies": {
+1 -1
View File
@@ -1 +1 @@
1.463.0
1.463.3