diff --git a/nexus/db-queries/src/db/queries/region_allocation.rs b/nexus/db-queries/src/db/queries/region_allocation.rs index d155258c216..b6ac154a6de 100644 --- a/nexus/db-queries/src/db/queries/region_allocation.rs +++ b/nexus/db-queries/src/db/queries/region_allocation.rs @@ -262,25 +262,47 @@ pub fn allocation_query( let mut builder = QueryBuilder::new(); - builder.sql( - // Find all old regions associated with a particular volume -"WITH + builder + .sql( + // Find all old regions associated with a particular volume + "WITH old_regions AS ( - SELECT ").sql(AllColumnsOfRegion::with_prefix("region")).sql(" - FROM region WHERE (region.volume_id = ").param().sql(")),") - .bind::(*volume_id.as_untyped_uuid()) - - // Calculates the old size being used by zpools under consideration as targets for region - // allocation. - .sql(" + SELECT ", + ) + .sql(AllColumnsOfRegion::with_prefix("region")) + .sql( + " + FROM region WHERE (region.volume_id = ", + ) + .param() + .sql(")),") + .bind::(*volume_id.as_untyped_uuid()) + // Calculates the old size being used by zpools under consideration as + // targets for region allocation. + // + // Account for the local storage dataset rendezvous tables not having been + // created yet (or for the integration tests, where blueprint execution is + // currently disabled) by performing a LEFT JOIN on pool_id and a coalesce + // for the size_used column. + .sql( + " old_zpool_usage AS ( SELECT crucible_dataset.pool_id, - sum(crucible_dataset.size_used) AS size_used - FROM crucible_dataset + ( + sum(crucible_dataset.size_used) + + sum(coalesce(rendezvous_local_storage_dataset.size_used, 0)) + ) AS size_used + FROM + crucible_dataset LEFT JOIN rendezvous_local_storage_dataset + ON + crucible_dataset.pool_id = rendezvous_local_storage_dataset.pool_id AND + rendezvous_local_storage_dataset.time_tombstoned is NULL WHERE - ((crucible_dataset.size_used IS NOT NULL) AND (crucible_dataset.time_deleted IS NULL)) - GROUP BY crucible_dataset.pool_id),"); + crucible_dataset.size_used IS NOT NULL AND + crucible_dataset.time_deleted IS NULL + GROUP BY crucible_dataset.pool_id),", + ); if let Some(snapshot_id) = snapshot_id { // Any zpool already have this volume's existing regions, or host the diff --git a/nexus/db-queries/tests/output/region_allocate_distinct_sleds.sql b/nexus/db-queries/tests/output/region_allocate_distinct_sleds.sql index 2106a598110..d335a34c4cf 100644 --- a/nexus/db-queries/tests/output/region_allocate_distinct_sleds.sql +++ b/nexus/db-queries/tests/output/region_allocate_distinct_sleds.sql @@ -22,11 +22,17 @@ WITH old_zpool_usage AS ( SELECT - crucible_dataset.pool_id, sum(crucible_dataset.size_used) AS size_used + crucible_dataset.pool_id, + sum(crucible_dataset.size_used) + + sum(COALESCE(rendezvous_local_storage_dataset.size_used, 0)) + AS size_used FROM crucible_dataset + LEFT JOIN rendezvous_local_storage_dataset ON + crucible_dataset.pool_id = rendezvous_local_storage_dataset.pool_id + AND rendezvous_local_storage_dataset.time_tombstoned IS NULL WHERE - (crucible_dataset.size_used IS NOT NULL) AND (crucible_dataset.time_deleted IS NULL) + crucible_dataset.size_used IS NOT NULL AND crucible_dataset.time_deleted IS NULL GROUP BY crucible_dataset.pool_id ), diff --git a/nexus/db-queries/tests/output/region_allocate_random_sleds.sql b/nexus/db-queries/tests/output/region_allocate_random_sleds.sql index f1b9d73038b..3dabfe1489b 100644 --- a/nexus/db-queries/tests/output/region_allocate_random_sleds.sql +++ b/nexus/db-queries/tests/output/region_allocate_random_sleds.sql @@ -22,11 +22,17 @@ WITH old_zpool_usage AS ( SELECT - crucible_dataset.pool_id, sum(crucible_dataset.size_used) AS size_used + crucible_dataset.pool_id, + sum(crucible_dataset.size_used) + + sum(COALESCE(rendezvous_local_storage_dataset.size_used, 0)) + AS size_used FROM crucible_dataset + LEFT JOIN rendezvous_local_storage_dataset ON + crucible_dataset.pool_id = rendezvous_local_storage_dataset.pool_id + AND rendezvous_local_storage_dataset.time_tombstoned IS NULL WHERE - (crucible_dataset.size_used IS NOT NULL) AND (crucible_dataset.time_deleted IS NULL) + crucible_dataset.size_used IS NOT NULL AND crucible_dataset.time_deleted IS NULL GROUP BY crucible_dataset.pool_id ), diff --git a/nexus/db-queries/tests/output/region_allocate_with_snapshot_distinct_sleds.sql b/nexus/db-queries/tests/output/region_allocate_with_snapshot_distinct_sleds.sql index 697091df30c..8a63b73f009 100644 --- a/nexus/db-queries/tests/output/region_allocate_with_snapshot_distinct_sleds.sql +++ b/nexus/db-queries/tests/output/region_allocate_with_snapshot_distinct_sleds.sql @@ -22,11 +22,17 @@ WITH old_zpool_usage AS ( SELECT - crucible_dataset.pool_id, sum(crucible_dataset.size_used) AS size_used + crucible_dataset.pool_id, + sum(crucible_dataset.size_used) + + sum(COALESCE(rendezvous_local_storage_dataset.size_used, 0)) + AS size_used FROM crucible_dataset + LEFT JOIN rendezvous_local_storage_dataset ON + crucible_dataset.pool_id = rendezvous_local_storage_dataset.pool_id + AND rendezvous_local_storage_dataset.time_tombstoned IS NULL WHERE - (crucible_dataset.size_used IS NOT NULL) AND (crucible_dataset.time_deleted IS NULL) + crucible_dataset.size_used IS NOT NULL AND crucible_dataset.time_deleted IS NULL GROUP BY crucible_dataset.pool_id ), diff --git a/nexus/db-queries/tests/output/region_allocate_with_snapshot_random_sleds.sql b/nexus/db-queries/tests/output/region_allocate_with_snapshot_random_sleds.sql index 9fcfac921fb..0d582340cc2 100644 --- a/nexus/db-queries/tests/output/region_allocate_with_snapshot_random_sleds.sql +++ b/nexus/db-queries/tests/output/region_allocate_with_snapshot_random_sleds.sql @@ -22,11 +22,17 @@ WITH old_zpool_usage AS ( SELECT - crucible_dataset.pool_id, sum(crucible_dataset.size_used) AS size_used + crucible_dataset.pool_id, + sum(crucible_dataset.size_used) + + sum(COALESCE(rendezvous_local_storage_dataset.size_used, 0)) + AS size_used FROM crucible_dataset + LEFT JOIN rendezvous_local_storage_dataset ON + crucible_dataset.pool_id = rendezvous_local_storage_dataset.pool_id + AND rendezvous_local_storage_dataset.time_tombstoned IS NULL WHERE - (crucible_dataset.size_used IS NOT NULL) AND (crucible_dataset.time_deleted IS NULL) + crucible_dataset.size_used IS NOT NULL AND crucible_dataset.time_deleted IS NULL GROUP BY crucible_dataset.pool_id ),