Skip to content

Commit 4838053

Browse files
[docs] post-merge doc/comment cleanup
1 parent 8850a5c commit 4838053

9 files changed

Lines changed: 123 additions & 193 deletions

File tree

Cargo.lock

Lines changed: 47 additions & 67 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dev-tools/omdb/tests/successes.out

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,11 @@ task: "physical_disk_adoption"
441441
ensure new physical disks are automatically marked in-service
442442

443443

444+
task: "populate_switch_ports"
445+
one-time population of the `switch_port` table containing all QSFP ports
446+
managed by dendrite
447+
448+
444449
task: "probe_distributor"
445450
distributes networking probe zones to sleds
446451

@@ -656,7 +661,7 @@ task: "bfd_manager"
656661
configured period: every <REDACTED_DURATION>s
657662
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
658663
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
659-
last completion reported error: failed to resolve addresses for Dendrite services: proto error: no records found for Query { name: Name("_mgs._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
664+
last completion reported error: proto error: no records found for Query { name: Name("_mgd._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
660665

661666
task: "blueprint_planner"
662667
configured period: every <REDACTED_DURATION>m
@@ -727,6 +732,7 @@ task: "fm_analysis"
727732
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
728733
parent sitrep ID: None
729734
current inventory collection ID: Some(..........<REDACTED_UUID>........... (collection))
735+
ereport classes consumed: (none)
730736
FAULT MANAGEMENT ANALYSIS SUMMARY
731737
=================================
732738
/!\ analysis failed: FM analysis is not yet implemented
@@ -887,7 +893,15 @@ task: "physical_disk_adoption"
887893
configured period: every <REDACTED_DURATION>s
888894
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
889895
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
890-
last completion reported error: task disabled
896+
physical disks added: 0
897+
/!\ task disabled
898+
899+
task: "populate_switch_ports"
900+
configured period: every <REDACTED_DURATION>s
901+
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
902+
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
903+
switch0 failed: failed to look up dendrite clients: proto error: no records found for Query { name: Name("_dendrite._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
904+
switch1 failed: failed to look up dendrite clients: proto error: no records found for Query { name: Name("_dendrite._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
891905

892906
task: "probe_distributor"
893907
configured period: every <REDACTED_DURATION>m
@@ -1002,6 +1016,7 @@ task: "sp_ereport_ingester"
10021016
configured period: every <REDACTED_DURATION>s
10031017
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
10041018
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1019+
SPs found via ignition: 0
10051020
total ereports received: <TOTAL_EREPORTS_RECEIVED_REDACTED>
10061021
new ereports ingested: <NEW_EREPORTS_INGESTED_REDACTED>
10071022
total HTTP requests sent: <TOTAL_HTTP_REQUESTS_SENT_REDACTED>
@@ -1342,7 +1357,7 @@ task: "bfd_manager"
13421357
configured period: every <REDACTED_DURATION>s
13431358
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
13441359
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1345-
last completion reported error: failed to resolve addresses for Dendrite services: proto error: no records found for Query { name: Name("_mgs._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
1360+
last completion reported error: proto error: no records found for Query { name: Name("_mgd._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
13461361

13471362
task: "blueprint_planner"
13481363
configured period: every <REDACTED_DURATION>m
@@ -1413,6 +1428,7 @@ task: "fm_analysis"
14131428
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
14141429
parent sitrep ID: None
14151430
current inventory collection ID: Some(..........<REDACTED_UUID>........... (collection))
1431+
ereport classes consumed: (none)
14161432
FAULT MANAGEMENT ANALYSIS SUMMARY
14171433
=================================
14181434
/!\ analysis failed: FM analysis is not yet implemented
@@ -1573,7 +1589,15 @@ task: "physical_disk_adoption"
15731589
configured period: every <REDACTED_DURATION>s
15741590
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
15751591
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1576-
last completion reported error: task disabled
1592+
physical disks added: 0
1593+
/!\ task disabled
1594+
1595+
task: "populate_switch_ports"
1596+
configured period: every <REDACTED_DURATION>s
1597+
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
1598+
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1599+
switch0 failed: failed to look up dendrite clients: proto error: no records found for Query { name: Name("_dendrite._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
1600+
switch1 failed: failed to look up dendrite clients: proto error: no records found for Query { name: Name("_dendrite._tcp.control-plane.oxide.internal."), query_type: SRV, query_class: IN }
15771601

15781602
task: "probe_distributor"
15791603
configured period: every <REDACTED_DURATION>m
@@ -1688,6 +1712,7 @@ task: "sp_ereport_ingester"
16881712
configured period: every <REDACTED_DURATION>s
16891713
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
16901714
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1715+
SPs found via ignition: 0
16911716
total ereports received: <TOTAL_EREPORTS_RECEIVED_REDACTED>
16921717
new ereports ingested: <NEW_EREPORTS_INGESTED_REDACTED>
16931718
total HTTP requests sent: <TOTAL_HTTP_REQUESTS_SENT_REDACTED>
@@ -1970,13 +1995,14 @@ parent: <none>
19701995
read from:: SingleNode
19711996

19721997
METADATA:
1973-
created by::::::::::::: nexus-test-utils
1974-
created at::::::::::::: <REDACTED_TIMESTAMP>
1975-
comment:::::::::::::::: initial test blueprint
1976-
internal DNS version::: 1
1977-
external DNS version::: 2
1978-
target release min gen: 1
1979-
nexus gen:::::::::::::: 1
1998+
created by:::::::::::::: nexus-test-utils
1999+
created at:::::::::::::: <REDACTED_TIMESTAMP>
2000+
comment::::::::::::::::: initial test blueprint
2001+
internal DNS version:::: 1
2002+
external DNS version:::: 2
2003+
target release min gen:: 1
2004+
nexus gen::::::::::::::: 1
2005+
external networking gen: 1
19802006

19812007
PENDING MGS-MANAGED UPDATES: 0
19822008

@@ -2116,13 +2142,14 @@ parent: <none>
21162142
read from:: SingleNode
21172143

21182144
METADATA:
2119-
created by::::::::::::: nexus-test-utils
2120-
created at::::::::::::: <REDACTED_TIMESTAMP>
2121-
comment:::::::::::::::: initial test blueprint
2122-
internal DNS version::: 1
2123-
external DNS version::: 2
2124-
target release min gen: 1
2125-
nexus gen:::::::::::::: 1
2145+
created by:::::::::::::: nexus-test-utils
2146+
created at:::::::::::::: <REDACTED_TIMESTAMP>
2147+
comment::::::::::::::::: initial test blueprint
2148+
internal DNS version:::: 1
2149+
external DNS version:::: 2
2150+
target release min gen:: 1
2151+
nexus gen::::::::::::::: 1
2152+
external networking gen: 1
21262153

21272154
PENDING MGS-MANAGED UPDATES: 0
21282155

@@ -2177,8 +2204,6 @@ Reconfigurator config:
21772204
modified time: <REDACTED_TIMESTAMP>
21782205
tuf repo pruner enabled: true
21792206
planner enabled: false
2180-
planner config:
2181-
add zones with mupdate override: false
21822207
---------------------------------------------
21832208
stderr:
21842209
note: using Nexus URL http://127.0.0.1:REDACTED_PORT/
@@ -2258,21 +2283,6 @@ stdout:
22582283
reconfigurator config updated to version 2:
22592284
tuf repo pruner enabled: true (unchanged)
22602285
* planner enabled::::::::: false -> true
2261-
planner config:
2262-
add zones with mupdate override: false (unchanged)
2263-
---------------------------------------------
2264-
stderr:
2265-
note: using Nexus URL http://127.0.0.1:REDACTED_PORT/
2266-
=============================================
2267-
EXECUTING COMMAND: omdb ["-w", "nexus", "reconfigurator-config", "set", "--add-zones-with-mupdate-override", "true"]
2268-
termination: Exited(0)
2269-
---------------------------------------------
2270-
stdout:
2271-
reconfigurator config updated to version 3:
2272-
tuf repo pruner enabled: true (unchanged)
2273-
planner enabled::::::::: true (unchanged)
2274-
planner config:
2275-
* add zones with mupdate override: false -> true
22762286
---------------------------------------------
22772287
stderr:
22782288
note: using Nexus URL http://127.0.0.1:REDACTED_PORT/
@@ -2282,12 +2292,10 @@ termination: Exited(0)
22822292
---------------------------------------------
22832293
stdout:
22842294
Reconfigurator config:
2285-
version: 3
2295+
version: 2
22862296
modified time: <REDACTED_TIMESTAMP>
22872297
tuf repo pruner enabled: true
22882298
planner enabled: true
2289-
planner config:
2290-
add zones with mupdate override: true
22912299
---------------------------------------------
22922300
stderr:
22932301
note: using Nexus URL http://127.0.0.1:REDACTED_PORT/

nexus/db-model/src/multicast_group.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
//! the dataplane (e.g., instance stopping/stopped, explicit detach, delete)
6767
//!
6868
//! Migration note: during instance migration, membership is reconfigured in
69-
//! placethe reconciler removes configuration from the old sled and applies it
69+
//! place; the reconciler removes configuration from the old sled and applies it
7070
//! on the new sled without transitioning the member to "Left". In other words,
7171
//! migration is not considered leaving; the member generally remains "Joined"
7272
//! while its `sled_id` and dataplane configuration are updated.

nexus/src/app/background/tasks/multicast/groups.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -699,15 +699,11 @@ impl MulticastGroupReconciler {
699699
}
700700
}
701701

702-
// TODO: Add front port selection for egress traffic (instances →
703-
// external). When transitioning groups to Active, we need to identify
704-
// and validate front ports against DPD's QSFP topology (similar to
705-
// `backplane_map` validation for rear ports). These uplink members use
706-
// `Direction::External` and follow a different lifecycle - added when
707-
// first instance joins, removed when last instance leaves.
708-
// Should integrate with `switch_ports_with_uplinks` or
709-
// equivalent front port discovery mechanism, which would be
710-
// configurable, and later learned (i.e., via `mcastd`/IGMP).
702+
// TODO: Front port selection for egress (instance → external) is
703+
// not yet implemented. See RFD 488 (§sect-external-mcast) for the
704+
// design. Uplink members will use `Direction::External` and
705+
// validate against DPD's QSFP topology rather than the
706+
// `backplane_map` used for rear-port underlay members.
711707

712708
// Handle underlay group creation/linking (same logic as before)
713709
if !self.process_creating_group_inner(opctx, group).await? {

nexus/src/app/background/tasks/multicast/members.rs

Lines changed: 10 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
//! - **Extensible processing**: Support for different member types (designed for
5555
//! future extension)
5656
//!
57-
//! ## Separation of Concerns: RPW +/- Sagas
57+
//! ## Separation of Concerns: RPW and Sagas
5858
//!
5959
//! **Sagas:**
6060
//! - Instance create/start → member "Joining" state
@@ -959,26 +959,6 @@ impl MulticastGroupReconciler {
959959
"error" => %e
960960
);
961961

962-
// TODO: Use DDM as the primary source of truth for sled→port
963-
// mapping, with inventory as cross-validation.
964-
//
965-
// Currently we trust inventory (MGS/SP topology) for sled→port
966-
// mapping. DDM (maghemite/ddmd) on switches has authoritative
967-
// knowledge of which sleds are reachable on which ports.
968-
//
969-
// Future approach:
970-
// 1. Query DDM for operational sled→port mapping
971-
// // TODO: Add GET /peers endpoint to ddm-admin-client
972-
// // returning Map<peer_addr, PeerInfo> where PeerInfo
973-
// // includes port/interface field (requires maghemite change)
974-
// 2. Use DDM mapping as primary source for multicast routing
975-
// 3. Cross-validate against inventory to detect mismatches
976-
// 4. On mismatch: invalidate cache, log warning, potentially
977-
// trigger inventory reconciliation
978-
//
979-
// This catches cases where inventory is stale or a sled moved
980-
// but inventory hasn't updated yet.
981-
982962
let updated = self
983963
.datastore
984964
.multicast_group_member_set_state_if_current(
@@ -1436,7 +1416,7 @@ impl MulticastGroupReconciler {
14361416

14371417
// Propagate M2P mappings and forwarding entries to all sleds.
14381418
//
1439-
// Athis point, the member is now "Joined" in the database, so propagate
1419+
// At this point, the member is now "Joined" in the database, so propagate
14401420
// includes this sled in forwarding next-hops. If propagation or
14411421
// subscribe fails below, the member remains "Joined" with incomplete
14421422
// sled state. The reconciler's next pass converges via
@@ -1543,19 +1523,8 @@ impl MulticastGroupReconciler {
15431523
);
15441524
}
15451525

1546-
// TODO: Add uplink (front port) members for egress traffic through to
1547-
// Dendrite.
1548-
//
1549-
// When this is the first instance joining the group, we should also add
1550-
// uplink members with `Direction::External` for multicast egress
1551-
// traffic out of the rack.
1552-
// These uplink members follow a different lifecycle:
1553-
// - Added when first instance joins (check group member count)
1554-
// - Removed when last instance leaves (would be handled in
1555-
// `remove_member_from_dataplane`)
1556-
//
1557-
// Uplink ports are probably going to be a group-level configuration
1558-
// added by external params.
1526+
// TODO: Uplink (front port) members for egress traffic are not yet
1527+
// added here. See RFD 488 (§sect-external-mcast) for the design.
15591528

15601529
info!(
15611530
opctx.log,
@@ -2144,7 +2113,7 @@ impl MulticastGroupReconciler {
21442113
}
21452114
};
21462115

2147-
// Only prune stale ports if we successfully resolved All "Joined" members.
2116+
// Only prune stale ports if we successfully resolved all "Joined" members.
21482117
// If we could not compute active member ports or if some members failed
21492118
// to resolve, avoid removing anything to prevent disrupting other members.
21502119
// We'll still proceed to ensure adding expected ports for this member.
@@ -2688,27 +2657,6 @@ impl MulticastGroupReconciler {
26882657
)
26892658
}
26902659

2691-
/// Refresh the sled-to-switch-port mapping cache using inventory data.
2692-
///
2693-
/// Maps each sled to its physical rear (backplane) port on the switch by:
2694-
/// 1. Getting sled's baseboard serial/part from the sled record
2695-
/// 2. Looking up the service processor (SP) in inventory for that baseboard
2696-
/// (SP information is collected from MGS by the inventory collector)
2697-
/// 3. Using `sp.sp_slot` (cubby number) to determine the rear port identifier
2698-
/// 4. Creating `PortId::Rear(RearPort::try_from(format!("rear{sp_slot}")))`
2699-
///
2700-
/// On the Dendrite side (switch's DPD daemon), a similar mapping is performed:
2701-
///
2702-
/// ```rust,ignore
2703-
/// // From dendrite/dpd/src/port_map.rs rev_ab_port_map()
2704-
/// for entry in SIDECAR_REV_AB_BACKPLANE_MAP.iter() {
2705-
/// let port = PortId::Rear(RearPort::try_from(entry.cubby).unwrap());
2706-
/// inner.insert(port, Connector::QSFP(entry.tofino_connector.into()));
2707-
/// }
2708-
/// ```
2709-
///
2710-
/// Where `entry.cubby` is the physical cubby/slot number (same as our `sp_slot`),
2711-
/// and this maps it to a `PortId::Rear` that DPD can program on the Tofino ASIC.
27122660
/// Fetch the sled-to-port mapping from DDM peer topology.
27132661
///
27142662
/// DDM peers provide live sled-to-port mapping via the `if_name`
@@ -2921,10 +2869,11 @@ impl MulticastGroupReconciler {
29212869
/// rejects any non-rear `PortId`. In production, a sled's only
29222870
/// physical path to a switch is the rack backplane.
29232871
///
2924-
/// TODO: Egress (uplink) members are not yet implemented. When they
2925-
/// land, they will come from group-level configuration applied
2926-
/// directly via DPD rather than from DDM peer discovery. See the
2927-
/// `TODO` in [`MulticastGroupReconciler::add_member_to_dataplane`].
2872+
/// TODO: Egress (uplink) members are not yet implemented. They will
2873+
/// not arrive via DDM peer discovery (which only covers intra-rack
2874+
/// underlay members); see RFD 488 (§sect-external-mcast) for the
2875+
/// design and remaining work. See also the `TODO` in
2876+
/// [`MulticastGroupReconciler::add_member_to_dataplane`].
29282877
fn parse_ddm_if_name_to_port(if_name: &str) -> Option<SwitchBackplanePort> {
29292878
use std::str::FromStr;
29302879

nexus/src/app/background/tasks/multicast/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
//! - Instance lifecycle (start/stop/migrate affecting group membership)
2121
//! - Network topology (sled-to-switch mappings, port configurations)
2222
//!
23-
//! ## Architecture: RPW +/- Sagas
23+
//! ## Architecture: RPW and Sagas
2424
//!
2525
//! **Sagas handle immediate operations:**
2626
//! - Instance lifecycle events (start/stop/delete)
@@ -99,7 +99,8 @@
9999
//! 4. **OPTE decapsulation** removes Geneve/IPv6/Ethernet outer headers on target sleds
100100
//! 5. **Instance delivery** of inner (guest-facing) packet to guest
101101
//!
102-
//! TODO: Other traffic flows like egress from instances will be documented separately.
102+
//! TODO: Egress (instance → external) is not yet supported. See RFD 488
103+
//! (§sect-external-mcast) for the design.
103104
//!
104105
//! ## Reconciliation Components
105106
//!
@@ -237,7 +238,7 @@ pub(crate) struct MulticastGroupReconciler {
237238
member_concurrency_limit: usize,
238239
/// Maximum number of groups to process concurrently.
239240
group_concurrency_limit: usize,
240-
/// Whether multicast functionality is enabled (or not).
241+
/// Whether multicast functionality is enabled.
241242
enabled: bool,
242243
}
243244

nexus/src/app/multicast/dataplane.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,16 +131,11 @@ pub(crate) type MulticastDataplaneResult<T> = Result<T, Error>;
131131
/// This handles multicast group and member operations across all switches
132132
/// in the rack, with automatic error handling and rollback.
133133
///
134-
/// TODO: Add `switch_port_uplinks` configuration to multicast groups for egress
135-
/// multicast traffic (instances → switches → external hosts).
136-
///
137-
/// Current implementation handles ingress (external → switches → instances)
138-
/// using rear ports with [`dpd_client::types::Direction::Underlay`]. For egress,
139-
/// we need:
140-
/// - Group-level uplink configuration (which front ports to use)
141-
/// - Uplink members with [`dpd_client::types::Direction::External`] added to
142-
/// underlay groups
143-
/// - Integration with existing `switch_ports_with_uplinks` for port discovery
134+
/// TODO: Egress (instance → external) is not yet supported. The current
135+
/// implementation only handles ingress (external → switches → instances)
136+
/// using rear ports with [`dpd_client::types::Direction::Underlay`]. See
137+
/// RFD 488 (§sect-external-mcast) for the egress design, which will use
138+
/// front-port uplink members with [`dpd_client::types::Direction::External`].
144139
pub(crate) struct MulticastDataplaneClient {
145140
dpd_clients: HashMap<SwitchSlot, dpd_client::Client>,
146141
log: Logger,

nexus/src/app/multicast/switch_zone.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ use crate::app::switch_zone_targets;
4444
/// so this client's direct-to-MGD path is intentional and should be preserved
4545
/// by the migration.
4646
///
47-
/// If a future iteration tightens around MRIB writes, the
48-
/// reconciler logic stays in Nexus and only the wire surface changes
49-
/// (Nexus calls a sled-agent endpoint that fronts MGD).
47+
/// If a follow-on to omicron#10167 routes MRIB writes through
48+
/// sled-agent, the reconciler logic stays in Nexus and only the wire
49+
/// surface changes: Nexus would call a sled-agent endpoint that fronts
50+
/// MGD instead of MGD directly.
5051
///
5152
/// [`MulticastDataplaneClient`]: super::dataplane::MulticastDataplaneClient
5253
/// [omicron#10167]: https://github.com/oxidecomputer/omicron/issues/10167

0 commit comments

Comments
 (0)