Skip to content

Commit 1e47888

Browse files
committed
use match to make adding variants a compile error
1 parent dd6ae81 commit 1e47888

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

nexus/db-queries/src/db/queries/region_allocation.rs

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
//! Implementation of queries for provisioning regions.
66
77
use crate::db::column_walker::AllColumnsOf;
8-
use crate::db::model::{CrucibleDataset, Region};
8+
use crate::db::model::{CrucibleDataset, Region, RegionReservationPercent};
99
use crate::db::raw_query_builder::{QueryBuilder, TypedSqlQuery};
1010
use crate::db::true_or_cast_error::matches_sentinel;
1111
use const_format::concatcp;
1212
use diesel::pg::Pg;
1313
use diesel::result::Error as DieselError;
1414
use diesel::sql_types;
1515
use nexus_config::RegionAllocationStrategy;
16+
use nexus_db_schema::enums::RegionReservationPercentEnum;
1617
use nexus_db_schema::schema;
1718
use omicron_common::api::external;
1819
use omicron_uuid_kinds::GenericUuid;
@@ -199,37 +200,40 @@ pub fn allocation_query(
199200
// low enough that this shouldn't truncate.
200201
let requested_size: i64 = requested_size.try_into().unwrap();
201202

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+
}
213218

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+
)?;
220225

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+
};
227234

228235
let redundancy: i64 = i64::try_from(redundancy).unwrap();
229236

230-
let reservation_percent =
231-
crate::db::model::RegionReservationPercent::TwentyFive;
232-
233237
let mut builder = QueryBuilder::new();
234238

235239
builder.sql(
@@ -396,7 +400,7 @@ pub fn allocation_query(
396400
.bind::<sql_types::BigInt, _>(params.blocks_per_extent as i64)
397401
.bind::<sql_types::BigInt, _>(params.extent_count as i64)
398402
.bind::<sql_types::Bool, _>(params.read_only)
399-
.bind::<nexus_db_schema::enums::RegionReservationPercentEnum, _>(reservation_percent)
403+
.bind::<RegionReservationPercentEnum, _>(reservation_percent)
400404
.bind::<sql_types::BigInt, _>(redundancy)
401405

402406
// A subquery which summarizes the changes we intend to make, showing:

0 commit comments

Comments
 (0)