From fc41816c946eba80f4959a1445d541250e662926 Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 27 Jul 2026 18:47:49 +0000 Subject: [PATCH 1/6] sled-agent side... --- Cargo.lock | 14 ++-- Cargo.toml | 10 +-- .../sled-agent-42.0.0-c9afad.json.gitstub | 1 + ...fad.json => sled-agent-43.0.0-9cba68.json} | 7 +- openapi/sled-agent/sled-agent-latest.json | 2 +- sled-agent/api/src/lib.rs | 21 +++++- .../src/add_vsock_component/instance.rs | 2 +- .../types/versions/src/impls/instance.rs | 5 +- sled-agent/types/versions/src/latest.rs | 6 +- sled-agent/types/versions/src/lib.rs | 2 + .../src/propolis_nvme_vwc/instance.rs | 75 +++++++++++++++++++ .../versions/src/propolis_nvme_vwc/mod.rs | 1 + 12 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 openapi/sled-agent/sled-agent-42.0.0-c9afad.json.gitstub rename openapi/sled-agent/{sled-agent-42.0.0-c9afad.json => sled-agent-43.0.0-9cba68.json} (99%) create mode 100644 sled-agent/types/versions/src/propolis_nvme_vwc/instance.rs create mode 100644 sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs diff --git a/Cargo.lock b/Cargo.lock index a63cd5fe43a..137eb1b5659 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "bhyve_api_sys", "libc", @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "libc", "strum 0.26.3", @@ -11854,7 +11854,7 @@ dependencies = [ [[package]] name = "propolis-api-types-versions" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "crucible-client-types", "propolis_types", @@ -11867,7 +11867,7 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "async-trait", "base64 0.21.7", @@ -11891,7 +11891,7 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "anyhow", "atty", @@ -11924,7 +11924,7 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "crucible-client-types", "propolis-api-types-versions", @@ -11933,7 +11933,7 @@ dependencies = [ [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=979b72896bc39a876c98fb32fe706da37a4fc408#979b72896bc39a876c98fb32fe706da37a4fc408" +source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" dependencies = [ "schemars 0.8.22", "serde", diff --git a/Cargo.toml b/Cargo.toml index 89b10dc2d71..6a13a8efa40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -747,11 +747,11 @@ progenitor-extras = "0.2.0" # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "979b72896bc39a876c98fb32fe706da37a4fc408" } -propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "979b72896bc39a876c98fb32fe706da37a4fc408" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "979b72896bc39a876c98fb32fe706da37a4fc408" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "979b72896bc39a876c98fb32fe706da37a4fc408" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "979b72896bc39a876c98fb32fe706da37a4fc408" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } +propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } # NOTE: see above! proptest = "1.7.0" qorb = "0.4.1" diff --git a/openapi/sled-agent/sled-agent-42.0.0-c9afad.json.gitstub b/openapi/sled-agent/sled-agent-42.0.0-c9afad.json.gitstub new file mode 100644 index 00000000000..4c687a3ba7e --- /dev/null +++ b/openapi/sled-agent/sled-agent-42.0.0-c9afad.json.gitstub @@ -0,0 +1 @@ +02d41eee19979824212b3963a7edc425d1bd73fa:openapi/sled-agent/sled-agent-42.0.0-c9afad.json diff --git a/openapi/sled-agent/sled-agent-42.0.0-c9afad.json b/openapi/sled-agent/sled-agent-43.0.0-9cba68.json similarity index 99% rename from openapi/sled-agent/sled-agent-42.0.0-c9afad.json rename to openapi/sled-agent/sled-agent-43.0.0-9cba68.json index a0c3ae6d43d..bba53c175b2 100644 --- a/openapi/sled-agent/sled-agent-42.0.0-c9afad.json +++ b/openapi/sled-agent/sled-agent-43.0.0-9cba68.json @@ -7,7 +7,7 @@ "url": "https://oxide.computer", "email": "api@oxide.computer" }, - "version": "42.0.0" + "version": "43.0.0" }, "paths": { "/artifacts": { @@ -7461,6 +7461,10 @@ } ] }, + "has_write_cache": { + "description": "Control if the NVMe disk reports the presence of a volatile write cache.\n\nThis generally should be configured in consideration of the storage backend for the NVMe device. \"true\" is a safe default, and was historically the only configurable value. If the storage backend will not lose data once writes are accepted, even in the face of unplanned crashes or power loss (or, if you really want to lie to guests), setting this to \"false\" can advise guests they may skip issuing flushes to the device.", + "type": "boolean" + }, "pci_path": { "description": "The PCI bus/device/function at which this disk should be attached.", "allOf": [ @@ -7483,6 +7487,7 @@ }, "required": [ "backend_id", + "has_write_cache", "pci_path", "serial_number" ], diff --git a/openapi/sled-agent/sled-agent-latest.json b/openapi/sled-agent/sled-agent-latest.json index f063eb9ede5..c4274d10015 120000 --- a/openapi/sled-agent/sled-agent-latest.json +++ b/openapi/sled-agent/sled-agent-latest.json @@ -1 +1 @@ -sled-agent-42.0.0-c9afad.json \ No newline at end of file +sled-agent-43.0.0-9cba68.json \ No newline at end of file diff --git a/sled-agent/api/src/lib.rs b/sled-agent/api/src/lib.rs index f7837c0a40a..a576af55a02 100644 --- a/sled-agent/api/src/lib.rs +++ b/sled-agent/api/src/lib.rs @@ -21,7 +21,7 @@ use omicron_common::api::internal::{ }; use sled_agent_types_versions::{ latest, v1, v4, v6, v7, v9, v10, v11, v12, v14, v16, v17, v18, v20, v22, - v24, v25, v26, v28, v29, v30, v31, v32, v33, v34, v37, v39, v42, + v24, v25, v26, v28, v29, v30, v31, v32, v33, v34, v37, v39, v41, v42, }; use sled_diagnostics::SledDiagnosticsQueryOutput; use slog_error_chain::InlineErrorChain; @@ -38,6 +38,7 @@ api_versions!([ // | example for the next person. // v // (next_int, IDENT), + (43, PROPOLIS_NVME_VWC), (42, NON_EMPTY_UPLINK_PORTS), (41, ADD_INSTANCE_PRIMARY_NIC_MTU), (40, ADD_FMD_TO_INVENTORY), @@ -446,7 +447,7 @@ pub trait SledAgentApi { operation_id = "vmm_register", method = PUT, path = "/vmms/{propolis_id}", - versions = VERSION_ADD_INSTANCE_PRIMARY_NIC_MTU.. + versions = VERSION_PROPOLIS_NVME_VWC.. }] async fn vmm_register( rqctx: RequestContext, @@ -454,6 +455,20 @@ pub trait SledAgentApi { body: TypedBody, ) -> Result, HttpError>; + #[endpoint { + operation_id = "vmm_register", + method = PUT, + path = "/vmms/{propolis_id}", + versions = VERSION_ADD_INSTANCE_PRIMARY_NIC_MTU..VERSION_PROPOLIS_NVME_VWC + }] + async fn vmm_register_v41( + rqctx: RequestContext, + path_params: Path, + body: TypedBody, + ) -> Result, HttpError> { + Self::vmm_register(rqctx, path_params, body.map(Into::into)).await + } + #[endpoint { operation_id = "vmm_register", method = PUT, @@ -465,7 +480,7 @@ pub trait SledAgentApi { path_params: Path, body: TypedBody, ) -> Result, HttpError> { - Self::vmm_register(rqctx, path_params, body.map(Into::into)).await + Self::vmm_register_v41(rqctx, path_params, body.map(Into::into)).await } #[endpoint { diff --git a/sled-agent/types/versions/src/add_vsock_component/instance.rs b/sled-agent/types/versions/src/add_vsock_component/instance.rs index 841d36e0b77..d3b3af2d9fc 100644 --- a/sled-agent/types/versions/src/add_vsock_component/instance.rs +++ b/sled-agent/types/versions/src/add_vsock_component/instance.rs @@ -5,7 +5,7 @@ use std::net::SocketAddr; use omicron_uuid_kinds::InstanceUuid; -use propolis_api_types::instance_spec::InstanceSpec; +use propolis_api_types_versions::v3::instance_spec::InstanceSpec; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use uuid::Uuid; diff --git a/sled-agent/types/versions/src/impls/instance.rs b/sled-agent/types/versions/src/impls/instance.rs index b7acbf4e9d8..f26c0ab14b5 100644 --- a/sled-agent/types/versions/src/impls/instance.rs +++ b/sled-agent/types/versions/src/impls/instance.rs @@ -10,11 +10,12 @@ use crate::latest::instance::VmmSpec; use crate::latest::instance::VmmState; use crate::latest::instance::VmmStateRequested; use crate::latest::inventory::SourceNatConfig; -use propolis_api_types::instance_spec::{ - Component, SpecKey, +use propolis_api_types::instance_spec::SpecKey; +use propolis_api_types_versions::latest::{ components::backends::{ CrucibleStorageBackend, FileStorageBackend, VirtioNetworkBackend, }, + instance_spec::Component, }; use std::collections::BTreeSet; use std::net::Ipv4Addr; diff --git a/sled-agent/types/versions/src/latest.rs b/sled-agent/types/versions/src/latest.rs index 7f20e84494a..01f56425091 100644 --- a/sled-agent/types/versions/src/latest.rs +++ b/sled-agent/types/versions/src/latest.rs @@ -114,15 +114,15 @@ pub mod instance { pub use crate::v7::instance::InstanceMulticastBody; pub use crate::v7::instance::InstanceMulticastMembership; - pub use crate::v29::instance::VmmSpec; - pub use crate::v31::instance::ResolvedVpcFirewallRule; pub use crate::v32::instance::ExternalIpConfig; pub use crate::v32::instance::ExternalIps; pub use crate::v32::instance::ExternalIpv4Config; pub use crate::v32::instance::ExternalIpv6Config; - pub use crate::v41::instance::InstanceEnsureBody; pub use crate::v41::instance::InstanceSledLocalConfig; + + pub use crate::v43::instance::InstanceEnsureBody; + pub use crate::v43::instance::VmmSpec; } pub mod inventory { diff --git a/sled-agent/types/versions/src/lib.rs b/sled-agent/types/versions/src/lib.rs index bb0547460be..29c04d19795 100644 --- a/sled-agent/types/versions/src/lib.rs +++ b/sled-agent/types/versions/src/lib.rs @@ -91,6 +91,8 @@ pub mod v40; pub mod v41; #[path = "non_empty_uplink_ports/mod.rs"] pub mod v42; +#[path = "propolis_nvme_vwc/mod.rs"] +pub mod v43; #[path = "add_probe_put_endpoint/mod.rs"] pub mod v6; #[path = "multicast_support/mod.rs"] diff --git a/sled-agent/types/versions/src/propolis_nvme_vwc/instance.rs b/sled-agent/types/versions/src/propolis_nvme_vwc/instance.rs new file mode 100644 index 00000000000..3c38c9b541b --- /dev/null +++ b/sled-agent/types/versions/src/propolis_nvme_vwc/instance.rs @@ -0,0 +1,75 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +//! Instance types for Sled Agent API versions 43. + +use std::net::SocketAddr; + +use omicron_uuid_kinds::InstanceUuid; + +use crate::v1::instance::InstanceMetadata; +use crate::v1::instance::VmmRuntimeState; +use crate::v29; +use crate::v41; +use crate::v41::instance::InstanceSledLocalConfig; +use propolis_api_types_versions::v6::instance_spec::InstanceSpec; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +/// Specifies the virtual hardware configuration of a new Propolis VMM in the +/// form of a Propolis instance specification. +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct VmmSpec(pub InstanceSpec); + +impl From for VmmSpec { + fn from(other: v29::instance::VmmSpec) -> VmmSpec { + let v6_spec: InstanceSpec = other.0.into(); + VmmSpec(v6_spec) + } +} + +/// The body of a request to ensure that a instance and VMM are known to a sled +/// agent. +#[derive(Serialize, Deserialize, JsonSchema)] +pub struct InstanceEnsureBody { + /// The virtual hardware configuration this virtual machine should have when + /// it is started. + pub vmm_spec: VmmSpec, + + /// Information about the sled-local configuration that needs to be + /// established to make the VM's virtual hardware fully functional. + pub local_config: InstanceSledLocalConfig, + + /// The initial VMM runtime state for the VMM being registered. + pub vmm_runtime: VmmRuntimeState, + + /// The ID of the instance for which this VMM is being created. + pub instance_id: InstanceUuid, + + /// The ID of the migration in to this VMM, if this VMM is being + /// ensured is part of a migration in. If this is `None`, the VMM is not + /// being created due to a migration. + pub migration_id: Option, + + /// The address at which this VMM should serve a Propolis server API. + pub propolis_addr: SocketAddr, + + /// Metadata used to track instance statistics. + pub metadata: InstanceMetadata, +} + +impl From for InstanceEnsureBody { + fn from(v41: v41::instance::InstanceEnsureBody) -> InstanceEnsureBody { + InstanceEnsureBody { + vmm_spec: v41.vmm_spec.into(), + local_config: v41.local_config, + vmm_runtime: v41.vmm_runtime, + instance_id: v41.instance_id, + migration_id: v41.migration_id, + propolis_addr: v41.propolis_addr, + metadata: v41.metadata, + } + } +} diff --git a/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs b/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs new file mode 100644 index 00000000000..1d5ea990951 --- /dev/null +++ b/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs @@ -0,0 +1 @@ +pub mod instance; From 9a70bc3ce6c347901e18e4dae2b627637872efff Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 27 Jul 2026 20:29:20 +0000 Subject: [PATCH 2/6] and that's it for Nexus? --- nexus/src/app/instance_platform/mod.rs | 51 +++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/nexus/src/app/instance_platform/mod.rs b/nexus/src/app/instance_platform/mod.rs index b78664da443..62f7022c12f 100644 --- a/nexus/src/app/instance_platform/mod.rs +++ b/nexus/src/app/instance_platform/mod.rs @@ -225,7 +225,7 @@ impl DisksByIdBuilder { Self { map: BTreeMap::new(), slot_usage: BTreeSet::new() } } - fn add_generic_disk( + fn add_nvme_disk( &mut self, disk: &Disk, backend: Component, @@ -246,12 +246,53 @@ impl DisksByIdBuilder { let pci_path = slot_to_pci_bdf(slot, PciDeviceKind::Disk)?; + // Generally we report that storage devices have volatile write cache + // semantics. This is a conservative default that matches most system + // behaviors. Crucible fast-acks writes and requires flushes to persist + // writes to non-volatile storage, and - theoretically - file-backed + // disks could be *any file* which may include normal POSIX "you must + // fdatasync() for writes to not be lost" semantics. + // + // This being anything other than "true" must be carefully considered; + // incorrectly claiming there is no write cache while the backing + // storage has volatile write cache semantics risks guest data loss in + // the event of power loss or crashes. + // + // On the other hand, when we can avoid claiming volatile write cache + // semantics, guest OSes know to not send spurious flushes. This can + // have important performance consequences from avoided VM exits, + // Propolis syscalls, interrupts, etc. + let volatile_write_cache = match &backend { + // We match on all fields so that if FileStorageBackend changes, + // those changes must consider if volatile-write-cache semantics are + // correctly captured here. + Component::FileStorageBackend(FileStorageBackend { + path, + readonly: _, + block_size: _, + workers: _, + }) => { + // In the product, for the forseeable future, local storage raw + // zvols are on enterprise U.2s which do not report volatile + // write caches. "/rdsk/" here refers to the character device + // for that raw volume with unbuffered semantics (versus + // `/dsk/`, the block device, which can buffer writes when not + // opened O_DIRECT - see spec_write(), vpm_data_copy(), and + // vpm_sync_pages()). + let vwc_semantics = !path.starts_with("/dev/zvol/rdsk/"); + + vwc_semantics + } + _ => true, + }; + let device = Component::NvmeDisk(NvmeDisk { backend_id: SpecKey::Uuid(disk.id()), pci_path, serial_number: zero_padded_nvme_serial_from_str( disk.name().as_str(), ), + has_write_cache: volatile_write_cache, }); let device_name = component_names::device_name_from_id(&disk.id()); @@ -279,10 +320,10 @@ impl DisksByIdBuilder { request_json: volume.data().to_owned(), }); - self.add_generic_disk(disk, backend) + self.add_nvme_disk(disk, backend) } - fn add_file_backed_disk( + fn add_local_disk( &mut self, disk: &Disk, path: String, @@ -296,7 +337,7 @@ impl DisksByIdBuilder { workers: Some(LOCAL_STORAGE_WORKERS), }); - self.add_generic_disk(disk, backend) + self.add_nvme_disk(disk, backend) } } @@ -526,7 +567,7 @@ impl super::Nexus { } db::datastore::Disk::LocalStorage(local_storage_disk) => { - builder.add_file_backed_disk( + builder.add_local_disk( disk, // Use the delegated zvol as the target for the file // backed disk From cf46c4c282857f165990bf4e3ec5bcc1dfc48259 Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 27 Jul 2026 21:13:54 +0000 Subject: [PATCH 3/6] package-manifest.toml --- package-manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-manifest.toml b/package-manifest.toml index 2ee8651ea5d..1b3bbfabd24 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -667,10 +667,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "979b72896bc39a876c98fb32fe706da37a4fc408" +source.commit = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "b950c8da9e2bb61eeb3b7087c27b2edab6c1b341ae8e7db6e88e7c172af58aff" +source.sha256 = "a22a130cb625c57ce7d4b3468d5ab47b22d6f9529ee49bea98a8a2033851a965" output.type = "zone" [package.mg-ddm-gz] From 45a3b95cb20708392495ca8aaa48ea31cf173462 Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 27 Jul 2026 22:01:51 +0000 Subject: [PATCH 4/6] license, XXX --- nexus/src/app/instance_platform/mod.rs | 5 +++++ sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/nexus/src/app/instance_platform/mod.rs b/nexus/src/app/instance_platform/mod.rs index 62f7022c12f..3507f8f922c 100644 --- a/nexus/src/app/instance_platform/mod.rs +++ b/nexus/src/app/instance_platform/mod.rs @@ -279,6 +279,11 @@ impl DisksByIdBuilder { // `/dsk/`, the block device, which can buffer writes when not // opened O_DIRECT - see spec_write(), vpm_data_copy(), and // vpm_sync_pages()). + // + // XXX: In development and non-product environments where + // storage may be commodity M.2s or worse, this can claim "no + // VWC semantics" when the underlying storage actually does. + // This could be improved. See Omicron#10933. let vwc_semantics = !path.starts_with("/dev/zvol/rdsk/"); vwc_semantics diff --git a/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs b/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs index 1d5ea990951..fed465ed41b 100644 --- a/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs +++ b/sled-agent/types/versions/src/propolis_nvme_vwc/mod.rs @@ -1 +1,5 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + pub mod instance; From 567701d4592e10fcf4e4f0498e580f58b3027844 Mon Sep 17 00:00:00 2001 From: iximeow Date: Thu, 30 Jul 2026 01:22:52 +0000 Subject: [PATCH 5/6] bump propolis to a commit from main --- Cargo.lock | 62 ++++++++++++++++++++++++++++--------------- Cargo.toml | 10 +++---- package-manifest.toml | 4 +-- 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 137eb1b5659..da6834af340 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "bhyve_api" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ "bhyve_api_sys", "libc", @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "bhyve_api_sys" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ "libc", "strum 0.26.3", @@ -2248,6 +2248,19 @@ dependencies = [ "uuid", ] +[[package]] +name = "crucible-client-types" +version = "0.1.0" +source = "git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022#ad8a31742adc45e925e63443a5b43c8e30604022" +dependencies = [ + "base64 0.22.1", + "crucible-workspace-hack", + "schemars 0.8.22", + "serde", + "serde_json", + "uuid", +] + [[package]] name = "crucible-common" version = "0.0.1" @@ -4544,11 +4557,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "wasip2", - "wasm-bindgen", ] [[package]] @@ -9674,7 +9685,7 @@ dependencies = [ "clap", "clickhouse-admin-types", "crucible-agent-client", - "crucible-client-types", + "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b)", "derive_more 0.99.20", "dice-verifier 0.3.0-pre0 (git+https://github.com/oxidecomputer/dice-util?branch=main)", "display-error-chain", @@ -11854,9 +11865,9 @@ dependencies = [ [[package]] name = "propolis-api-types-versions" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ - "crucible-client-types", + "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", "propolis_types", "schemars 0.8.22", "serde", @@ -11867,11 +11878,11 @@ dependencies = [ [[package]] name = "propolis-client" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ "async-trait", "base64 0.21.7", - "crucible-client-types", + "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", "futures", "progenitor 0.14.0", "progenitor-client 0.14.0", @@ -11891,10 +11902,9 @@ dependencies = [ [[package]] name = "propolis-mock-server" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ "anyhow", - "atty", "base64 0.21.7", "clap", "dropshot", @@ -11924,16 +11934,16 @@ dependencies = [ [[package]] name = "propolis_api_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ - "crucible-client-types", + "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", "propolis-api-types-versions", ] [[package]] name = "propolis_types" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/propolis?rev=65417b83f31b63ec1f7a981aeec78d304cec3bd0#65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ "schemars 0.8.22", "serde", @@ -12034,9 +12044,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases 0.2.1", @@ -12045,7 +12055,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.3", + "socket2 0.5.10", "thiserror 2.0.18", "tokio", "tracing", @@ -12054,15 +12064,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.1", "lru-slab", - "rand 0.9.2", + "rand 0.10.1", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -12216,6 +12227,15 @@ dependencies = [ "rand 0.9.2", ] +[[package]] +name = "rand_pcg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a36dd10a879f5c16e363eed24471b321b114ce3112c2d5d8df06545fcf48152" +dependencies = [ + "rand_core 0.10.0", +] + [[package]] name = "rand_seeder" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 6a13a8efa40..6da1735be00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -747,11 +747,11 @@ progenitor-extras = "0.2.0" # NOTE: if you change the pinned revision of the `bhyve_api` and propolis # dependencies, you must also update the references in package-manifest.toml to # match the new revision. -bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } -propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } -propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } -propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } -propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" } +bhyve_api = { git = "https://github.com/oxidecomputer/propolis", rev = "046f74302e2ea09a75b0a6810645d42c7df6644a" } +propolis-api-types-versions = { git = "https://github.com/oxidecomputer/propolis", rev = "046f74302e2ea09a75b0a6810645d42c7df6644a" } +propolis_api_types = { git = "https://github.com/oxidecomputer/propolis", rev = "046f74302e2ea09a75b0a6810645d42c7df6644a" } +propolis-client = { git = "https://github.com/oxidecomputer/propolis", rev = "046f74302e2ea09a75b0a6810645d42c7df6644a" } +propolis-mock-server = { git = "https://github.com/oxidecomputer/propolis", rev = "046f74302e2ea09a75b0a6810645d42c7df6644a" } # NOTE: see above! proptest = "1.7.0" qorb = "0.4.1" diff --git a/package-manifest.toml b/package-manifest.toml index 1b3bbfabd24..0b60d85f9ef 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -667,10 +667,10 @@ service_name = "propolis-server" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "propolis" -source.commit = "65417b83f31b63ec1f7a981aeec78d304cec3bd0" +source.commit = "046f74302e2ea09a75b0a6810645d42c7df6644a" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/propolis/image//propolis-server.sha256.txt -source.sha256 = "a22a130cb625c57ce7d4b3468d5ab47b22d6f9529ee49bea98a8a2033851a965" +source.sha256 = "42a6096035caeccb5f3472a6418180a5c961e4eec870ccf55f55ec7153406268" output.type = "zone" [package.mg-ddm-gz] From d2510bb297535e59962c464ad27412a88f7510a7 Mon Sep 17 00:00:00 2001 From: iximeow Date: Thu, 30 Jul 2026 01:41:04 +0000 Subject: [PATCH 6/6] bump Crucible along with Propolis --- Cargo.lock | 29 ++++++++--------------------- Cargo.toml | 10 +++++----- package-manifest.toml | 12 ++++++------ 3 files changed, 19 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da6834af340..8d4f544ad3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2222,7 +2222,7 @@ dependencies = [ [[package]] name = "crucible-agent-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b#2bfe090eb5318ec8c467157018db2429d4df535b" +source = "git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022#ad8a31742adc45e925e63443a5b43c8e30604022" dependencies = [ "anyhow", "chrono", @@ -2235,19 +2235,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "crucible-client-types" -version = "0.1.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b#2bfe090eb5318ec8c467157018db2429d4df535b" -dependencies = [ - "base64 0.22.1", - "crucible-workspace-hack", - "schemars 0.8.22", - "serde", - "serde_json", - "uuid", -] - [[package]] name = "crucible-client-types" version = "0.1.0" @@ -2264,7 +2251,7 @@ dependencies = [ [[package]] name = "crucible-common" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b#2bfe090eb5318ec8c467157018db2429d4df535b" +source = "git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022#ad8a31742adc45e925e63443a5b43c8e30604022" dependencies = [ "anyhow", "atty", @@ -2294,7 +2281,7 @@ dependencies = [ [[package]] name = "crucible-pantry-client" version = "0.0.1" -source = "git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b#2bfe090eb5318ec8c467157018db2429d4df535b" +source = "git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022#ad8a31742adc45e925e63443a5b43c8e30604022" dependencies = [ "anyhow", "chrono", @@ -2311,7 +2298,7 @@ dependencies = [ [[package]] name = "crucible-smf" version = "0.0.0" -source = "git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b#2bfe090eb5318ec8c467157018db2429d4df535b" +source = "git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022#ad8a31742adc45e925e63443a5b43c8e30604022" dependencies = [ "crucible-workspace-hack", "libc", @@ -9685,7 +9672,7 @@ dependencies = [ "clap", "clickhouse-admin-types", "crucible-agent-client", - "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=2bfe090eb5318ec8c467157018db2429d4df535b)", + "crucible-client-types", "derive_more 0.99.20", "dice-verifier 0.3.0-pre0 (git+https://github.com/oxidecomputer/dice-util?branch=main)", "display-error-chain", @@ -11867,7 +11854,7 @@ name = "propolis-api-types-versions" version = "0.0.0" source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ - "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", + "crucible-client-types", "propolis_types", "schemars 0.8.22", "serde", @@ -11882,7 +11869,7 @@ source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0 dependencies = [ "async-trait", "base64 0.21.7", - "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", + "crucible-client-types", "futures", "progenitor 0.14.0", "progenitor-client 0.14.0", @@ -11936,7 +11923,7 @@ name = "propolis_api_types" version = "0.0.0" source = "git+https://github.com/oxidecomputer/propolis?rev=046f74302e2ea09a75b0a6810645d42c7df6644a#046f74302e2ea09a75b0a6810645d42c7df6644a" dependencies = [ - "crucible-client-types 0.1.0 (git+https://github.com/oxidecomputer/crucible?rev=ad8a31742adc45e925e63443a5b43c8e30604022)", + "crucible-client-types", "propolis-api-types-versions", ] diff --git a/Cargo.toml b/Cargo.toml index 6da1735be00..f9c4f58e0b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -489,11 +489,11 @@ crossterm = { version = "0.29.0", features = ["event-stream"] } # NOTE: if you change the pinned revision of the `crucible` dependencies, you # must also update the references in package-manifest.toml to match the new # revision. -crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "2bfe090eb5318ec8c467157018db2429d4df535b" } -crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "2bfe090eb5318ec8c467157018db2429d4df535b" } -crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "2bfe090eb5318ec8c467157018db2429d4df535b" } -crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "2bfe090eb5318ec8c467157018db2429d4df535b" } -crucible-client-types = { git = "https://github.com/oxidecomputer/crucible", rev = "2bfe090eb5318ec8c467157018db2429d4df535b" } +crucible-agent-client = { git = "https://github.com/oxidecomputer/crucible", rev = "ad8a31742adc45e925e63443a5b43c8e30604022" } +crucible-pantry-client = { git = "https://github.com/oxidecomputer/crucible", rev = "ad8a31742adc45e925e63443a5b43c8e30604022" } +crucible-smf = { git = "https://github.com/oxidecomputer/crucible", rev = "ad8a31742adc45e925e63443a5b43c8e30604022" } +crucible-common = { git = "https://github.com/oxidecomputer/crucible", rev = "ad8a31742adc45e925e63443a5b43c8e30604022" } +crucible-client-types = { git = "https://github.com/oxidecomputer/crucible", rev = "ad8a31742adc45e925e63443a5b43c8e30604022" } # NOTE: See above! csv = "1.3.1" curve25519-dalek = "4" diff --git a/package-manifest.toml b/package-manifest.toml index 0b60d85f9ef..fdb84dd3739 100644 --- a/package-manifest.toml +++ b/package-manifest.toml @@ -624,10 +624,10 @@ only_for_targets.image = "standard" # 3. Use source.type = "manual" instead of "prebuilt" source.type = "prebuilt" source.repo = "crucible" -source.commit = "2bfe090eb5318ec8c467157018db2429d4df535b" +source.commit = "ad8a31742adc45e925e63443a5b43c8e30604022" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible.sha256.txt -source.sha256 = "86d155da32960b2d64bb0cceaccddfe10ae5bc8b44335e144436eeb0d5999b09" +source.sha256 = "b8e9f74961228dba38d6b2bcb2b5a0082aa5483a2c278fcc062af7c93009a4d3" output.type = "zone" output.intermediate_only = true @@ -636,10 +636,10 @@ service_name = "crucible_pantry_prebuilt" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "2bfe090eb5318ec8c467157018db2429d4df535b" +source.commit = "ad8a31742adc45e925e63443a5b43c8e30604022" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-pantry.sha256.txt -source.sha256 = "48d1e97bb1129666b5af5ca412eef3a1e99026c10222436bc04ad95dde8aaaf4" +source.sha256 = "c3305dd749870647eb2eceb79f4a8f696ea28602fdda40d7be8a2768a7748757" output.type = "zone" output.intermediate_only = true @@ -653,10 +653,10 @@ service_name = "crucible_utils" only_for_targets.image = "standard" source.type = "prebuilt" source.repo = "crucible" -source.commit = "2bfe090eb5318ec8c467157018db2429d4df535b" +source.commit = "ad8a31742adc45e925e63443a5b43c8e30604022" # The SHA256 digest is automatically posted to: # https://buildomat.eng.oxide.computer/public/file/oxidecomputer/crucible/image//crucible-utils.sha256.txt -source.sha256 = "103aacff3cf1ffd29c0c66edaab1eeab85cf3123d149ebf4c6b1ee309d8d20ba" +source.sha256 = "b2d933a87870d01632d974ff8ea0d46f53f439999adeacb1173dbca983b3d9fe" output.type = "tarball" # Refer to