From 0f67ea255e4b6b590c42586ab52593c520b32476 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 14 Jan 2026 08:49:41 +0100 Subject: [PATCH 1/5] feat: Support configuring the external endpoint of Trino clusters for ackUri rewriting --- CHANGELOG.md | 4 + trino-lb-core/src/config.rs | 4 + trino-lb-core/src/trino_api.rs | 117 +++++++++++++++++- trino-lb-core/src/trino_query.rs | 6 + ...8b812633632a68235f2fa26f80a9c5352ded.json} | 5 +- ...9250d852451790bb2509b260fafdb268b6b1.json} | 12 +- trino-lb-persistence/src/postgres/README.md | 16 +++ ...0101314410_add_trino_external_endpoint.sql | 3 + trino-lb-persistence/src/postgres/mod.rs | 18 ++- trino-lb/src/cluster_group_manager.rs | 2 + trino-lb/src/http_server/v1/statement.rs | 11 +- trino-lb/src/scaling/mod.rs | 1 + 12 files changed, 186 insertions(+), 13 deletions(-) rename trino-lb-persistence/.sqlx/{query-dcdff617008bd9e5db76c1aa6099da4728bca33d362d6ff990e14b7e4b17288b.json => query-1f8cc8bc6093d2fc198d0b2849568b812633632a68235f2fa26f80a9c5352ded.json} (60%) rename trino-lb-persistence/.sqlx/{query-d6b1cc38b5e80b51b157d1989beec66a68126c1606a1ae39caeed6ecd380b9f1.json => query-e727412091850e7ac76082775abe9250d852451790bb2509b260fafdb268b6b1.json} (66%) create mode 100644 trino-lb-persistence/src/postgres/README.md create mode 100644 trino-lb-persistence/src/postgres/migrations/20260101314410_add_trino_external_endpoint.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index cae06d0..8ff1458 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ All notable changes to this project will be documented in this file. - Support activating and deactivation Trino clusters via API calls to `/admin/clusters/{cluster_name}/activate` and `/admin/clusters/{cluster_name}/deactivate` respectively. For this to work you need to authenticate yourself at trino-lb via basic auth ([#95]). - Expose cluster statistics at `/admin/clusters/{cluster_name}/status` and `/admin/clusters/status` ([#95]). +- Support configuring an external endpoint of Trino clusters. + This is used to update the segments ackUris to, as sometimes Trino get's confused and put's the wrong endpoint (namely the one of trino-lb) in there. + Please note that this runs a database migration on Postgres ([#XX]). ### Changed @@ -28,6 +31,7 @@ All notable changes to this project will be documented in this file. [#86]: https://github.com/stackabletech/trino-lb/pull/86 [#91]: https://github.com/stackabletech/trino-lb/pull/91 [#95]: https://github.com/stackabletech/trino-lb/pull/95 +[#XX]: https://github.com/stackabletech/trino-lb/pull/XX ## [0.5.0] - 2025-03-14 diff --git a/trino-lb-core/src/config.rs b/trino-lb-core/src/config.rs index 19c4287..71745ca 100644 --- a/trino-lb-core/src/config.rs +++ b/trino-lb-core/src/config.rs @@ -191,6 +191,10 @@ pub struct TrinoClusterGroupConfig { pub struct TrinoClusterConfig { pub name: String, pub endpoint: Url, + + /// Public endpoint of the Trino cluster. + /// This can e.g. be used to change segment ackUris to. + pub external_endpoint: Option, pub credentials: TrinoClusterCredentialsConfig, } diff --git a/trino-lb-core/src/trino_api.rs b/trino-lb-core/src/trino_api.rs index d03dcc5..1c020d0 100644 --- a/trino-lb-core/src/trino_api.rs +++ b/trino-lb-core/src/trino_api.rs @@ -5,7 +5,7 @@ use std::{ use prusto::{QueryError, Warning}; use serde::{Deserialize, Serialize}; -use serde_json::value::RawValue; +use serde_json::{Value, value::RawValue}; use snafu::{ResultExt, Snafu}; use tracing::instrument; use url::Url; @@ -23,6 +23,12 @@ pub enum Error { #[snafu(display("Failed to parse nextUri Trino send us"))] ParseNextUriFromTrino { source: url::ParseError }, + #[snafu(display("Failed to parse segment ackUri Trino send us"))] + ParseSegmentAckUriFromTrino { source: url::ParseError }, + + #[snafu(display("Failed to change segment ackUri to point to external Trino address"))] + ChangeSegmentAckUriToTrino { source: url::ParseError }, + #[snafu(display( "Failed to determine the elapsed time of a queued query. Are all system clocks of trino-lb instances in sync?" ))] @@ -48,7 +54,7 @@ pub struct TrinoQueryApiResponse { pub partial_cancel_uri: Option, pub columns: Option>, - pub data: Option>, + pub data: Option>, pub error: Option, pub warnings: Vec, @@ -156,29 +162,81 @@ impl TrinoQueryApiResponse { }) } + /// Changes the following references in the query (if they exist) + /// + /// 1. nextUri to point to trino-lb + /// 2. In case the `external_trino_addr` is set, segments ackUri to point to the external + /// address of Trino. Trino sometimes get's confused (likely by some HTTP) headers and put's the + /// trino-lb address into the ackUri (but the requests should go to Trino directly). #[instrument( skip(self), fields(trino_lb_addr = %trino_lb_addr), )] - pub fn change_next_uri_to_trino_lb(&mut self, trino_lb_addr: &Url) -> Result<(), Error> { + pub fn update_trino_references( + &mut self, + trino_lb_addr: &Url, + external_trino_addr: Option<&Url>, + ) -> Result<(), Error> { + // Point nextUri to trino-lb if let Some(next_uri) = &self.next_uri { let next_uri = Url::parse(next_uri).context(ParseNextUriFromTrinoSnafu)?; self.next_uri = Some(change_next_uri_to_trino_lb(&next_uri, trino_lb_addr).to_string()); } + // Point segment ackUris to Trino + if let Some(external_trino_addr) = external_trino_addr + && let Some(data) = self.data.as_deref_mut() + { + change_segment_ack_uris_to_trino(data, external_trino_addr)?; + } + Ok(()) } } +#[instrument( + fields(next_uri = %next_uri, trino_lb_addr = %trino_lb_addr), +)] fn change_next_uri_to_trino_lb(next_uri: &Url, trino_lb_addr: &Url) -> Url { let mut result = trino_lb_addr.clone(); result.set_path(next_uri.path()); result } +#[instrument( + skip(data), + fields(external_trino_addr = %external_trino_addr), +)] +fn change_segment_ack_uris_to_trino( + data: &mut Value, + external_trino_addr: &Url, +) -> Result<(), Error> { + let Some(segments) = data.get_mut("segments").and_then(Value::as_array_mut) else { + return Ok(()); + }; + + for segment in segments { + if let Some("spooled") = segment.get("type").and_then(Value::as_str) + && let Some(ack_uri) = segment.get_mut("ackUri") + && let Some(ack_uri_str) = ack_uri.as_str() + { + let parsed_ack_uri = ack_uri_str + .parse::() + .context(ParseSegmentAckUriFromTrinoSnafu)?; + let mut result = external_trino_addr.clone(); + result.set_path(parsed_ack_uri.path()); + + *ack_uri = Value::String(result.to_string()); + } + } + + Ok(()) +} + #[cfg(test)] mod tests { use rstest::rstest; + use serde_json::json; use super::*; @@ -210,4 +268,57 @@ mod tests { let result = change_next_uri_to_trino_lb(&next_uri, &trino_lb_addr); assert_eq!(result.to_string(), expected); } + + #[test] + fn test_change_segment_ack_uris_to_trino() { + let mut data = json!({ + "encoding": "json+zstd", + "segments": [ + { + "type": "spooled", + "uri": "https://minio:9000/trino/spooling/01KCAH1KEE432S8VXFDJTZYTTT.json%2Bzstd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251212T121622Z&X-Amz-SignedHeaders=host%3Bx-amz-server-side-encryption-customer-algorithm%3Bx-amz-server-side-encryption-customer-key%3Bx-amz-server-side-encryption-customer-key-md5&X-Amz-Credential=minioAccessKey%2F20251212%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=3600&X-Amz-Signature=331b80bdae6c92352d12985ae8863dddbc72c755d49466c1aeeb732cd08b7d8d", + "ackUri": "https://trino-client-spooling-coordinator:8443/v1/spooled/ack/LYp8Bg6PDoTuUO86fmNMQNhtC0xryOhvWpL2LXhwLI4=", + "metadata": { + "segmentSize": 2716023, + "uncompressedSize": 7706400, + "rowsCount": 43761, + "expiresAt": "2025-12-13T01:16:21.454", + "rowOffset": 10952 + }, + "headers": { + "x-amz-server-side-encryption-customer-algorithm": [ + "AES256" + ], + "x-amz-server-side-encryption-customer-key": [ + "iemW0eosEhVVn+QR3q/OApysz8ieRCzAHngdoJFlbHY=" + ], + "x-amz-server-side-encryption-customer-key-MD5": [ + "D1VfXAwD/ffApNMNf3gBig==" + ] + } + } + ] + }); + let external_trino_addr = "https://trino-external:1234" + .parse() + .expect("static URL is always valid"); + + change_segment_ack_uris_to_trino(&mut data, &external_trino_addr).unwrap(); + + let segment = data + .get("segments") + .unwrap() + .as_array() + .unwrap() + .first() + .unwrap(); + assert_eq!( + segment.get("uri").unwrap(), + "https://minio:9000/trino/spooling/01KCAH1KEE432S8VXFDJTZYTTT.json%2Bzstd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251212T121622Z&X-Amz-SignedHeaders=host%3Bx-amz-server-side-encryption-customer-algorithm%3Bx-amz-server-side-encryption-customer-key%3Bx-amz-server-side-encryption-customer-key-md5&X-Amz-Credential=minioAccessKey%2F20251212%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=3600&X-Amz-Signature=331b80bdae6c92352d12985ae8863dddbc72c755d49466c1aeeb732cd08b7d8d" + ); + assert_eq!( + segment.get("ackUri").unwrap(), + "https://trino-external:1234/v1/spooled/ack/LYp8Bg6PDoTuUO86fmNMQNhtC0xryOhvWpL2LXhwLI4=" + ); + } } diff --git a/trino-lb-core/src/trino_query.rs b/trino-lb-core/src/trino_query.rs index 9701ac8..ebf0d0e 100644 --- a/trino-lb-core/src/trino_query.rs +++ b/trino-lb-core/src/trino_query.rs @@ -52,6 +52,10 @@ pub struct TrinoQuery { /// Endpoint of the Trino cluster the query is running on. pub trino_endpoint: Url, + /// (Optionally, if configured) public endpoint of the Trino cluster. + /// This can e.g. be used to change segment ackUris to. + pub trino_external_endpoint: Option, + /// The time the query was submitted to trino-lb. pub creation_time: SystemTime, @@ -80,6 +84,7 @@ impl TrinoQuery { trino_cluster: TrinoClusterName, trino_query_id: TrinoQueryId, trino_endpoint: Url, + trino_external_endpoint: Option, creation_time: SystemTime, delivered_time: SystemTime, ) -> Self { @@ -87,6 +92,7 @@ impl TrinoQuery { id: trino_query_id, trino_cluster, trino_endpoint, + trino_external_endpoint, creation_time, delivered_time, } diff --git a/trino-lb-persistence/.sqlx/query-dcdff617008bd9e5db76c1aa6099da4728bca33d362d6ff990e14b7e4b17288b.json b/trino-lb-persistence/.sqlx/query-1f8cc8bc6093d2fc198d0b2849568b812633632a68235f2fa26f80a9c5352ded.json similarity index 60% rename from trino-lb-persistence/.sqlx/query-dcdff617008bd9e5db76c1aa6099da4728bca33d362d6ff990e14b7e4b17288b.json rename to trino-lb-persistence/.sqlx/query-1f8cc8bc6093d2fc198d0b2849568b812633632a68235f2fa26f80a9c5352ded.json index a184cf3..a2abdf4 100644 --- a/trino-lb-persistence/.sqlx/query-dcdff617008bd9e5db76c1aa6099da4728bca33d362d6ff990e14b7e4b17288b.json +++ b/trino-lb-persistence/.sqlx/query-1f8cc8bc6093d2fc198d0b2849568b812633632a68235f2fa26f80a9c5352ded.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO queries (id, trino_cluster, trino_endpoint, creation_time, delivered_time)\n VALUES ($1, $2, $3, $4, $5)", + "query": "INSERT INTO queries (id, trino_cluster, trino_endpoint, trino_external_endpoint, creation_time, delivered_time)\n VALUES ($1, $2, $3, $4, $5, $6)", "describe": { "columns": [], "parameters": { @@ -8,11 +8,12 @@ "Varchar", "Varchar", "Varchar", + "Varchar", "Timestamptz", "Timestamptz" ] }, "nullable": [] }, - "hash": "dcdff617008bd9e5db76c1aa6099da4728bca33d362d6ff990e14b7e4b17288b" + "hash": "1f8cc8bc6093d2fc198d0b2849568b812633632a68235f2fa26f80a9c5352ded" } diff --git a/trino-lb-persistence/.sqlx/query-d6b1cc38b5e80b51b157d1989beec66a68126c1606a1ae39caeed6ecd380b9f1.json b/trino-lb-persistence/.sqlx/query-e727412091850e7ac76082775abe9250d852451790bb2509b260fafdb268b6b1.json similarity index 66% rename from trino-lb-persistence/.sqlx/query-d6b1cc38b5e80b51b157d1989beec66a68126c1606a1ae39caeed6ecd380b9f1.json rename to trino-lb-persistence/.sqlx/query-e727412091850e7ac76082775abe9250d852451790bb2509b260fafdb268b6b1.json index 45ce62e..cb5a1ab 100644 --- a/trino-lb-persistence/.sqlx/query-d6b1cc38b5e80b51b157d1989beec66a68126c1606a1ae39caeed6ecd380b9f1.json +++ b/trino-lb-persistence/.sqlx/query-e727412091850e7ac76082775abe9250d852451790bb2509b260fafdb268b6b1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, trino_cluster, trino_endpoint, creation_time, delivered_time\n FROM queries\n WHERE id = $1", + "query": "SELECT id, trino_cluster, trino_endpoint, trino_external_endpoint, creation_time, delivered_time\n FROM queries\n WHERE id = $1", "describe": { "columns": [ { @@ -20,11 +20,16 @@ }, { "ordinal": 3, + "name": "trino_external_endpoint", + "type_info": "Varchar" + }, + { + "ordinal": 4, "name": "creation_time", "type_info": "Timestamptz" }, { - "ordinal": 4, + "ordinal": 5, "name": "delivered_time", "type_info": "Timestamptz" } @@ -38,9 +43,10 @@ false, false, false, + true, false, false ] }, - "hash": "d6b1cc38b5e80b51b157d1989beec66a68126c1606a1ae39caeed6ecd380b9f1" + "hash": "e727412091850e7ac76082775abe9250d852451790bb2509b260fafdb268b6b1" } diff --git a/trino-lb-persistence/src/postgres/README.md b/trino-lb-persistence/src/postgres/README.md new file mode 100644 index 0000000..cb48fc5 --- /dev/null +++ b/trino-lb-persistence/src/postgres/README.md @@ -0,0 +1,16 @@ +First start a postgres: + +```bash +docker run --rm -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=admin postgres +``` + +Afterwards you set the `DATABASE_URL` env var and prepare stuff for offline compilation: + +```bash +export DATABASE_URL=postgres://postgres:postgres@localhost/postgres + +cd trino-lb-persistence + +cargo sqlx migrate run --source src/postgres/migrations +cargo sqlx prepare --workspace +``` diff --git a/trino-lb-persistence/src/postgres/migrations/20260101314410_add_trino_external_endpoint.sql b/trino-lb-persistence/src/postgres/migrations/20260101314410_add_trino_external_endpoint.sql new file mode 100644 index 0000000..aff5474 --- /dev/null +++ b/trino-lb-persistence/src/postgres/migrations/20260101314410_add_trino_external_endpoint.sql @@ -0,0 +1,3 @@ +ALTER TABLE queries + -- nullable, as it's Option<&str> +ADD trino_external_endpoint VARCHAR; diff --git a/trino-lb-persistence/src/postgres/mod.rs b/trino-lb-persistence/src/postgres/mod.rs index 710eb31..7d08f25 100644 --- a/trino-lb-persistence/src/postgres/mod.rs +++ b/trino-lb-persistence/src/postgres/mod.rs @@ -92,6 +92,9 @@ pub enum Error { #[snafu(display("Failed to parse endpoint url of cluster from stored query"))] ParseClusterEndpointFromStoredQuery { source: url::ParseError }, + #[snafu(display("Failed to parse external endpoint url of cluster from stored query"))] + ParseClusterExternalEndpointFromStoredQuery { source: url::ParseError }, + #[snafu(display("Failed to convert max query counter to u64, as it is too high"))] ConvertMaxAllowedQueryCounterToU64 { source: TryFromIntError }, @@ -204,11 +207,12 @@ impl Persistence for PostgresPersistence { #[instrument(skip(self, query))] async fn store_query(&self, query: TrinoQuery) -> Result<(), super::Error> { query!( - r#"INSERT INTO queries (id, trino_cluster, trino_endpoint, creation_time, delivered_time) - VALUES ($1, $2, $3, $4, $5)"#, + r#"INSERT INTO queries (id, trino_cluster, trino_endpoint, trino_external_endpoint, creation_time, delivered_time) + VALUES ($1, $2, $3, $4, $5, $6)"#, query.id, query.trino_cluster, query.trino_endpoint.as_str(), + query.trino_external_endpoint.as_ref().map(Url::as_str), Into::>::into(query.creation_time), Into::>::into(query.delivered_time), ) @@ -222,7 +226,7 @@ impl Persistence for PostgresPersistence { #[instrument(skip(self))] async fn load_query(&self, query_id: &TrinoQueryId) -> Result { let result = query!( - r#"SELECT id, trino_cluster, trino_endpoint, creation_time, delivered_time + r#"SELECT id, trino_cluster, trino_endpoint, trino_external_endpoint, creation_time, delivered_time FROM queries WHERE id = $1"#, query_id, @@ -231,11 +235,19 @@ impl Persistence for PostgresPersistence { .await .context(LoadQuerySnafu)?; + let trino_external_endpoint = match result.trino_external_endpoint { + Some(trino_external_endpoint) => Some( + Url::parse(&trino_external_endpoint) + .context(ParseClusterExternalEndpointFromStoredQuerySnafu)?, + ), + None => None, + }; let query = TrinoQuery { id: result.id, trino_cluster: result.trino_cluster, trino_endpoint: Url::parse(&result.trino_endpoint) .context(ParseClusterEndpointFromStoredQuerySnafu)?, + trino_external_endpoint, creation_time: result.creation_time.into(), delivered_time: result.delivered_time.into(), }; diff --git a/trino-lb/src/cluster_group_manager.rs b/trino-lb/src/cluster_group_manager.rs index b98f419..1156399 100644 --- a/trino-lb/src/cluster_group_manager.rs +++ b/trino-lb/src/cluster_group_manager.rs @@ -86,6 +86,7 @@ pub struct TrinoCluster { pub name: String, pub max_running_queries: u64, pub endpoint: Url, + pub external_endpoint: Option, } #[derive(Clone, Debug, Serialize)] @@ -145,6 +146,7 @@ impl ClusterGroupManager { name: cluster_name, max_running_queries: group_config.max_running_queries, endpoint: cluster_config.endpoint.clone(), + external_endpoint: cluster_config.external_endpoint.clone(), }) } groups.insert(group_name.clone(), group); diff --git a/trino-lb/src/http_server/v1/statement.rs b/trino-lb/src/http_server/v1/statement.rs index be55120..ffed593 100644 --- a/trino-lb/src/http_server/v1/statement.rs +++ b/trino-lb/src/http_server/v1/statement.rs @@ -304,6 +304,7 @@ async fn queue_or_hand_over_query( cluster.name.clone(), trino_query_api_response.id.clone(), cluster.endpoint.clone(), + cluster.external_endpoint.clone(), *creation_time, SystemTime::now(), ); @@ -316,7 +317,10 @@ async fn queue_or_hand_over_query( )?; trino_query_api_response - .change_next_uri_to_trino_lb(&state.config.trino_lb.external_address) + .update_trino_references( + &state.config.trino_lb.external_address, + cluster.external_endpoint.as_ref(), + ) .context(ModifyNextUriSnafu)?; info!( @@ -458,7 +462,10 @@ async fn handle_query_running_on_trino( if trino_query_api_response.next_uri.is_some() { // Change the nextUri to actually point to trino-lb instead of Trino. trino_query_api_response - .change_next_uri_to_trino_lb(&state.config.trino_lb.external_address) + .update_trino_references( + &state.config.trino_lb.external_address, + query.trino_external_endpoint.as_ref(), + ) .context(ModifyNextUriSnafu)?; } else { info!(%query_id, "Query completed (no next_uri send)"); diff --git a/trino-lb/src/scaling/mod.rs b/trino-lb/src/scaling/mod.rs index 9fdf66f..8c83010 100644 --- a/trino-lb/src/scaling/mod.rs +++ b/trino-lb/src/scaling/mod.rs @@ -200,6 +200,7 @@ impl Scaler { name: cluster_name, max_running_queries: group_config.max_running_queries, endpoint: cluster_config.endpoint.clone(), + external_endpoint: cluster_config.external_endpoint.clone(), }) } groups.insert(group_name.clone(), group); From f72c9add47a07caeb25cf18058292110260ed267 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 14 Jan 2026 09:35:12 +0100 Subject: [PATCH 2/5] Remove unnecessary file --- _TEST/query-finished.json | 79 --------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 _TEST/query-finished.json diff --git a/_TEST/query-finished.json b/_TEST/query-finished.json deleted file mode 100644 index 3135491..0000000 --- a/_TEST/query-finished.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "id": "20251212_121505_00013_em2hb", - "nextUri": null, - "infoUri": "https://trino-client-spooling-coordinator:8443/ui/query.html?20251212_121505_00013_em2hb", - "partialCancelUri": null, - "columns": [ - { - "name": "_col0", - "type": "bigint", - "typeSignature": { - "rawType": "bigint", - "arguments": [] - } - } - ], - "data": null, - "error": null, - "warnings": [], - "stats": { - "completedSplits": 41, - "cpuTimeMillis": 8768, - "elapsedTimeMillis": 10002, - "nodes": 1, - "peakMemoryBytes": 2896, - "physicalInputBytes": 0, - "processedBytes": 0, - "processedRows": 15000000, - "progressPercentage": 100.0, - "queuedSplits": 0, - "queuedTimeMillis": 0, - "queued": false, - "rootStage": { - "completedSplits": 17, - "coordinatorOnly": false, - "cpuTimeMillis": 8, - "done": true, - "failedTasks": 0, - "nodes": 1, - "physicalInputBytes": 0, - "processedBytes": 1056, - "processedRows": 24, - "queuedSplits": 0, - "runningSplits": 0, - "stageId": "0", - "state": "FINISHED", - "subStages": [ - { - "completedSplits": 24, - "coordinatorOnly": false, - "cpuTimeMillis": 8760, - "done": true, - "failedTasks": 0, - "nodes": 1, - "physicalInputBytes": 0, - "processedBytes": 0, - "processedRows": 15000000, - "queuedSplits": 0, - "runningSplits": 0, - "stageId": "1", - "state": "FINISHED", - "subStages": [], - "totalSplits": 24, - "wallTimeMillis": 207600 - } - ], - "totalSplits": 17, - "wallTimeMillis": 195 - }, - "runningPercentage": 0.0, - "runningSplits": 0, - "scheduled": true, - "spilledBytes": 0, - "state": "FINISHED", - "totalSplits": 41, - "wallTimeMillis": 207795 - }, - "updateType": null, - "updateCount": null -} From ec1c67a20d70b89fe9642109754971146d098f24 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 14 Jan 2026 09:55:27 +0100 Subject: [PATCH 3/5] changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 840563f..213d713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ All notable changes to this project will be documented in this file. - Expose cluster statistics at `/admin/clusters/{cluster_name}/status` and `/admin/clusters/status` ([#95]). - Support configuring an external endpoint of Trino clusters. This is used to update the segments ackUris to, as sometimes Trino get's confused and put's the wrong endpoint (namely the one of trino-lb) in there. - Please note that this runs a database migration on Postgres ([#XX]). + Please note that this runs a database migration on Postgres ([#100]). ### Changed @@ -33,7 +33,7 @@ All notable changes to this project will be documented in this file. [#91]: https://github.com/stackabletech/trino-lb/pull/91 [#95]: https://github.com/stackabletech/trino-lb/pull/95 [#98]: https://github.com/stackabletech/trino-lb/pull/98 -[#XX]: https://github.com/stackabletech/trino-lb/pull/XX +[#100]: https://github.com/stackabletech/trino-lb/pull/100 ## [0.5.0] - 2025-03-14 From 7c17b4eb7c7b6acee701083e201a7635d9815d13 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 14 Jan 2026 11:46:53 +0100 Subject: [PATCH 4/5] fix trailing whitespace --- trino-lb-persistence/src/postgres/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trino-lb-persistence/src/postgres/README.md b/trino-lb-persistence/src/postgres/README.md index cb48fc5..84e8e90 100644 --- a/trino-lb-persistence/src/postgres/README.md +++ b/trino-lb-persistence/src/postgres/README.md @@ -1,7 +1,7 @@ First start a postgres: ```bash -docker run --rm -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=admin postgres +docker run --rm -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=admin postgres ``` Afterwards you set the `DATABASE_URL` env var and prepare stuff for offline compilation: From 26e2840830bfbf1299291935ad642a0003eb2111 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 14 Jan 2026 11:50:34 +0100 Subject: [PATCH 5/5] markdown linter --- trino-lb-persistence/src/postgres/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/trino-lb-persistence/src/postgres/README.md b/trino-lb-persistence/src/postgres/README.md index 84e8e90..20827c2 100644 --- a/trino-lb-persistence/src/postgres/README.md +++ b/trino-lb-persistence/src/postgres/README.md @@ -1,3 +1,5 @@ +# Postgres sqlx stuff + First start a postgres: ```bash