|
5 | 5 | //! Implementation of queries for provisioning regions. |
6 | 6 |
|
7 | 7 | use crate::db::column_walker::AllColumnsOf; |
8 | | -use crate::db::model::{CrucibleDataset, Region}; |
| 8 | +use crate::db::model::{CrucibleDataset, Region, RegionReservationPercent}; |
9 | 9 | use crate::db::raw_query_builder::{QueryBuilder, TypedSqlQuery}; |
10 | 10 | use crate::db::true_or_cast_error::matches_sentinel; |
11 | 11 | use const_format::concatcp; |
12 | 12 | use diesel::pg::Pg; |
13 | 13 | use diesel::result::Error as DieselError; |
14 | 14 | use diesel::sql_types; |
15 | 15 | use nexus_config::RegionAllocationStrategy; |
| 16 | +use nexus_db_schema::enums::RegionReservationPercentEnum; |
16 | 17 | use nexus_db_schema::schema; |
17 | 18 | use omicron_common::api::external; |
18 | 19 | use omicron_uuid_kinds::GenericUuid; |
@@ -199,37 +200,40 @@ pub fn allocation_query( |
199 | 200 | // low enough that this shouldn't truncate. |
200 | 201 | let requested_size: i64 = requested_size.try_into().unwrap(); |
201 | 202 |
|
202 | | - // The Crucible Agent's current reservation factor is 25%, so add that here. |
203 | | - // Check first that the requested region size is divisible by this. This |
204 | | - // should basically never fail because all block sizes are divisible by 4. |
205 | | - if requested_size % 4 != 0 { |
206 | | - return Err( |
207 | | - AllocationQueryError::RequestedRegionNotDivisibleByFactor { |
208 | | - request: requested_size, |
209 | | - factor: 4, |
210 | | - }, |
211 | | - ); |
212 | | - } |
| 203 | + let reservation_percent = RegionReservationPercent::TwentyFive; |
| 204 | + |
| 205 | + let size_delta: i64 = match reservation_percent { |
| 206 | + RegionReservationPercent::TwentyFive => { |
| 207 | + // Check first that the requested region size is divisible by this. |
| 208 | + // This should basically never fail because all block sizes are |
| 209 | + // divisible by 4. |
| 210 | + if requested_size % 4 != 0 { |
| 211 | + return Err( |
| 212 | + AllocationQueryError::RequestedRegionNotDivisibleByFactor { |
| 213 | + request: requested_size, |
| 214 | + factor: 4, |
| 215 | + }, |
| 216 | + ); |
| 217 | + } |
213 | 218 |
|
214 | | - let overhead: i64 = requested_size.checked_div(4).ok_or( |
215 | | - AllocationQueryError::RequestedRegionNotDivisibleByFactor { |
216 | | - request: requested_size, |
217 | | - factor: 4, |
218 | | - }, |
219 | | - )?; |
| 219 | + let overhead: i64 = requested_size.checked_div(4).ok_or( |
| 220 | + AllocationQueryError::RequestedRegionNotDivisibleByFactor { |
| 221 | + request: requested_size, |
| 222 | + factor: 4, |
| 223 | + }, |
| 224 | + )?; |
220 | 225 |
|
221 | | - let size_delta: i64 = requested_size.checked_add(overhead).ok_or( |
222 | | - AllocationQueryError::RequestedRegionOverheadOverflow { |
223 | | - request: requested_size, |
224 | | - overhead, |
225 | | - }, |
226 | | - )?; |
| 226 | + requested_size.checked_add(overhead).ok_or( |
| 227 | + AllocationQueryError::RequestedRegionOverheadOverflow { |
| 228 | + request: requested_size, |
| 229 | + overhead, |
| 230 | + }, |
| 231 | + )? |
| 232 | + } |
| 233 | + }; |
227 | 234 |
|
228 | 235 | let redundancy: i64 = i64::try_from(redundancy).unwrap(); |
229 | 236 |
|
230 | | - let reservation_percent = |
231 | | - crate::db::model::RegionReservationPercent::TwentyFive; |
232 | | - |
233 | 237 | let mut builder = QueryBuilder::new(); |
234 | 238 |
|
235 | 239 | builder.sql( |
@@ -396,7 +400,7 @@ pub fn allocation_query( |
396 | 400 | .bind::<sql_types::BigInt, _>(params.blocks_per_extent as i64) |
397 | 401 | .bind::<sql_types::BigInt, _>(params.extent_count as i64) |
398 | 402 | .bind::<sql_types::Bool, _>(params.read_only) |
399 | | - .bind::<nexus_db_schema::enums::RegionReservationPercentEnum, _>(reservation_percent) |
| 403 | + .bind::<RegionReservationPercentEnum, _>(reservation_percent) |
400 | 404 | .bind::<sql_types::BigInt, _>(redundancy) |
401 | 405 |
|
402 | 406 | // A subquery which summarizes the changes we intend to make, showing: |
|
0 commit comments