Skip to content

"sled add" could use a guard against attempting to add a previously-used sled that has not been clean slated #11671

Open

Description

@davepacheco

I'm not sure what would happen if you tried to add a sled that had not been clean slated, but I don't think it would be good. We should make sure this somehow fails gracefully and in a way that can be observed by the user.

Activity

  1. davepacheco commented on Nov 3, 2026

    @davepacheco
    CollaboratorAuthor

    I'm not clear how bad it would be to insert a non-clean-slated but expunged sled, possibly from another rack, into a rack.

    I did just test this on berlin by:

    • starting with all four sleds in the rack
    • removing sled 17 from TQ, waiting for that to become committed
    • power cycling the sled
    • expunging the sled from the control plane
    • re-adding the sled

    The TQ config has been Committing for almost 10 minutes now. (Is this stuck forever? Is there a way out of this?) The sled is reporting this in the sled agent log:

    271FVPY0 # grep -v 'failed to sample kstat target' $(svcs -L sled-agent) | looker -lwarn -o long
    [ Dec 28 00:00:03 Enabled. ]
    [ Dec 28 00:00:42 Executing start method ("ctrun -l child -o noorphan,regent /opt/oxide/sled-agent/sled-agent run /opt/oxide/sled-agent/pkg/config.toml &"). ]
    [ Dec 28 00:00:43 Method "start" exited with status 0. ]
    note: configured to log to "/dev/stdout"
    Dec 28 00:00:45.579 INFO tofino monitor online, unit: tofino-monitor
    1986-12-28 00:00:46.616Z WARN SledAgent/665 (DebugCollector-worker) on 271FVPY0: Not configuring DumpSlicePath("/devices/pci@0,0/pci1de,fff9@1,3/pci1344,3100@0/blkdev@w00A075013280E319,0:e") as it appears to contain a dump we cannot yet send to a U.2 debug zvol
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:815
    1986-12-28 00:00:46.627Z ERRO SledAgent/665 (DebugCollector-worker) on 271FVPY0: Archiving skipped: no archival destination available
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:893
    1986-12-28 00:00:48.361Z WARN SledAgent/665 (DdmReconciler) on 271FVPY0: failed to enable stats
        error = Error Response: status: 500 Internal Server Error; headers: {"content-type": "application/json", "x-request-id": "65497f1e-de35-4a5b-8236-451e59176b88", "content-length": "124", "date": "Sun, 28 Dec 1986 00:00:48 GMT"}; value: Error { error_code: Some("Internal"), message: "Internal Server Error", request_id: "65497f1e-de35-4a5b-8236-451e59176b88" }
        file = sled-agent/src/ddm_reconciler.rs:206
    1986-12-28 00:00:56.302Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: Received Expunged message for newer epoch. Recording expungement in persistent state.
        baseboard_id = 913-0000019:271FVPY0
        epoch = 11
        file = trust-quorum/protocol/src/node.rs:530
        from = 913-0000019:BRM42220082
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
        received_epoch = 12
    1986-12-28 00:00:56.303Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: expunged
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM44220007
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:00:56.303Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: expunged
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM42220011
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:02:56.301Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079E665" }
        error = Failed to adopt disk containing zpool 89a7bcc8-8505-4857-b711-507670fdc5fc: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:04:56.302Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079DF02" }
        error = Failed to adopt disk containing zpool b6fe6ca1-4d9e-4a47-9c2a-ac64a90f921a: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:05:46.655Z WARN SledAgent/665 (DebugCollector-worker) on 271FVPY0: Not configuring DumpSlicePath("/devices/pci@0,0/pci1de,fff9@1,3/pci1344,3100@0/blkdev@w00A075013280E319,0:e") as it appears to contain a dump we cannot yet send to a U.2 debug zvol
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:815
    1986-12-28 00:05:46.665Z ERRO SledAgent/665 (DebugCollector-worker) on 271FVPY0: Archiving skipped: no archival destination available
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:893
    1986-12-28 00:06:56.303Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079E3AD" }
        error = Failed to adopt disk containing zpool 5ad076b1-0ea8-4b72-b41c-ee1526700f66: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:08:06.366Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: prepare
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM42220082
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:08:56.305Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079DF08" }
        error = Failed to adopt disk containing zpool 8d6185ff-f66e-4946-ab86-1bfa28f7f80b: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:09:05.238Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:09:05.265Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: get_share
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM42220082
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:09:05.266Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: get_share
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM42220011
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:09:05.271Z WARN SledAgent/665 (trust-quorum) on 271FVPY0: get_share
        baseboard_id = 913-0000019:271FVPY0
        file = trust-quorum/protocol/src/node.rs:413
        from = 913-0000019:BRM44220007
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:09:53.411Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:09:53.679Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:10:05.066Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:10:46.694Z WARN SledAgent/665 (DebugCollector-worker) on 271FVPY0: Not configuring DumpSlicePath("/devices/pci@0,0/pci1de,fff9@1,3/pci1344,3100@0/blkdev@w00A075013280E319,0:e") as it appears to contain a dump we cannot yet send to a U.2 debug zvol
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:815
    1986-12-28 00:10:46.704Z ERRO SledAgent/665 (DebugCollector-worker) on 271FVPY0: Archiving skipped: no archival destination available
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:893
    1986-12-28 00:10:53.515Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:10:53.581Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:10:56.306Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079E3D2" }
        error = Failed to adopt disk containing zpool 1234012c-4f44-4b93-8218-4166bb55f775: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:11:05.164Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:11:53.470Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:11:53.515Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:12:05.021Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:12:53.485Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:12:53.593Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:12:56.307Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079DDE7" }
        error = Failed to adopt disk containing zpool 848f40a4-f53b-43a5-a6c9-8721c96cc6ca: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:13:05.167Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:13:53.564Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:13:53.600Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:14:05.045Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:14:53.428Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:14:53.491Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:14:56.308Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079DDCC" }
        error = Failed to adopt disk containing zpool 266b4961-011b-419a-a65b-730cef657981: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:15:05.064Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:15:46.731Z WARN SledAgent/665 (DebugCollector-worker) on 271FVPY0: Not configuring DumpSlicePath("/devices/pci@0,0/pci1de,fff9@1,3/pci1344,3100@0/blkdev@w00A075013280E319,0:e") as it appears to contain a dump we cannot yet send to a U.2 debug zvol
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:815
    1986-12-28 00:15:46.745Z ERRO SledAgent/665 (DebugCollector-worker) on 271FVPY0: Archiving skipped: no archival destination available
        file = sled-agent/config-reconciler/src/debug_collector/worker.rs:893
    1986-12-28 00:15:53.414Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:15:53.435Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:16:05.062Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:16:53.542Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:16:53.569Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:16:56.308Z WARN SledAgent/665 (ConfigReconcilerTask) on 271FVPY0: Disk adoption failed
        disk_identity = DiskIdentity { vendor: "1b96", model: "WUS4C6432DSP3X3", serial: "A079E567" }
        error = Failed to adopt disk containing zpool c903a9a4-f935-476b-83f5-38b3df04ac81: KeyManager error: Failed to retrieve secret: Timeout retrieving secret: Timeout retrieving secret
        file = sled-agent/config-reconciler/src/reconciler_task/external_disks.rs:620
    1986-12-28 00:17:05.052Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:17:53.403Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:17:53.464Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    1986-12-28 00:18:05.021Z ERRO SledAgent/665 (trust-quorum) on 271FVPY0: PrepareAndCommit attempted on expunged node
        baseboard_id = 913-0000019:271FVPY0
        expunged_epoch = 12
        expunging_node = 913-0000019:BRM42220082
        file = trust-quorum/protocol/src/node.rs:232
        platform_id = BaseboardId { part_number: "913-0000019", serial_number: "271FVPY0" }
    

    The sled brought up its old underlay IP:

    271FVPY0 # ipadm
    ADDROBJ           TYPE     STATE        ADDR
    lo0/v4            static   ok           127.0.0.1/8
    lo0/v6            static   ok           ::1/128
    cxgbe0/ll         addrconf ok           fe80::aa40:25ff:fe04:28d7%cxgbe0/10
    cxgbe1/ll         addrconf ok           fe80::aa40:25ff:fe04:28df%cxgbe1/10
    bootstrap0/ll     addrconf ok           fe80::8:20ff:fe52:9e91%bootstrap0/10
    bootstrap0/bootstrap6 static ok         fdb0:a840:2504:28d7::1/64
    underlay0/ll      addrconf ok           fe80::8:20ff:fee0:5883%underlay0/10
    underlay0/sled6   static   ok           fdcc:7057:faf9:125::1/64
    
    [berlin]root@oxz_switch1:~# omdb db sleds -F decommissioned
    note: database URL not specified.  Will search DNS.
    note: (override with --db-url or OMDB_DB_URL)
    note: using DNS from system config (typically /etc/resolv.conf)
    note: (if this is not right, use --dns-server to specify an alternate DNS server)
    note: using database URL postgresql://root@[fdcc:7057:faf9:102::11]:32221,[fdcc:7057:faf9:101::3]:32221,[fdcc:7057:faf9:102::3]:32221,[fdcc:7057:faf9:103::3]:32221,[fdcc:7057:faf9:101::11]:32221/omicron?sslmode=disable
    note: database schema version matches expected (311.0.0)
     SERIAL    IP                             ROLE  POLICY    STATE           BP AVAIL        ID                                   
     271FVPY0  [fdcc:7057:faf9:122::1]:12345  -     expunged  decommissioned  decommissioned  05d3df4e-66e1-4c24-8618-f4467bad4ed5 
     271FVPY0  [fdcc:7057:faf9:125::1]:12345  -     expunged  decommissioned  decommissioned  1c5aff87-2a5f-4de5-9b45-d45b9d0c3d41 
     271FVPY0  [fdcc:7057:faf9:121::1]:12345  -     expunged  decommissioned  decommissioned  1d54d23c-2133-4050-ab14-fad8a2fcfd2c 
     271FVPY0  [fdcc:7057:faf9:123::1]:12345  -     expunged  decommissioned  decommissioned  a8b2f303-8588-471c-916b-16a5a5306d81 
     271FVPY0  [fdcc:7057:faf9:104::1]:12345  -     expunged  decommissioned  decommissioned  af2c58b7-e6d3-4805-8969-7715fd108a8b 
     271FVPY0  [fdcc:7057:faf9:124::1]:12345  -     expunged  decommissioned  decommissioned  f9627989-91f1-4f64-99fa-d0b55ea81f44 
    

    (I was doing a bunch of expunge/add testing here.)

    [berlin]root@oxz_switch1:~# ping fdcc:7057:faf9:125::1
    fdcc:7057:faf9:125::1 is alive
    

    That seems bad. (What if this IP were in use by a sled in this rack?) Is its boostrap IP unique? At least it's not able to unlock its local storage and start control plane components.

  2. davepacheco commented on Nov 3, 2026

    @davepacheco
    CollaboratorAuthor

    I guessed maybe the live-but-not-working sled was holding up the TQ change, but having let it sit overnight and then powered off the sled, it's still stuck Committing.

  3. jgallagher commented on Nov 3, 2026

    @jgallagher
    Contributor

    That seems bad. (What if this IP were in use by a sled in this rack?)

    No argument that it seems bad, but I don't think the IP can be in use - we never reuse sled subnet reservations (at least today, which means we have a hard cap on how many sleds can added to a rack over its lifetime):

    if allocation.subnet_octet == new_allocation.subnet_octet {
    bail_unless!(
    new_allocation.subnet_octet < 255,
    "Too many sled subnets allocated"
    );
    new_allocation.subnet_octet += 1;
    }

    Is its bootstrap IP necessarily unique?

    Yes; bootstrap addrs are derived from the NIC's MAC:

    // TODO(https://github.com/oxidecomputer/omicron/issues/945): This address
    // could be randomly generated when it no longer needs to be durable.
    /// Derive the bootstrap IP address for the given interface by reading
    /// the MAC address of the given physical link.
    pub async fn bootstrap_ip(
    interface: BootstrapInterface,
    link: &PhysicalLink,
    ) -> Result<Ipv6Addr, dladm::GetMacError> {
    let mac = Dladm::get_mac(link).await?;
    Ok(mac_to_bootstrap_ip(mac, interface.interface_id()))
    }

  4. jgallagher commented on Nov 3, 2026

    @jgallagher
    Contributor

    3. I guessed maybe the live-but-not-working sled was holding up the TQ change, but having let it sit overnight and then powered off the sled, it's still stuck Committing.

    @andrewjstone would know for sure, but I think you're going to be stuck in committing until either:

    • that sled shows up and is able to participate
    • you send a new configuration that removes that sled

    because the sled you're trying to add has to participate in order for the current epoch (which adds it) to commit?

  5. davepacheco commented on Nov 3, 2026

    @davepacheco
    CollaboratorAuthor

    4. > That seems bad. (What if this IP were in use by a sled in this rack?)

        No argument that it seems bad, but I don't think the IP can be in use - we never reuse sled subnet reservations (at least today, which means we have a hard cap on how many sleds can added to a rack over its lifetime):  https://github.com/oxidecomputer/omicron/blob/40b22e54b97a8592f61595cda46e81279e14cf6a/nexus/db-queries/src/db/datastore/rack.rs#L386-L392
    

    I think this is still a risk (probably small) if it comes from another rack.

    1. I guessed maybe the live-but-not-working sled was holding up the TQ change, but having let it sit overnight and then powered off the sled, it's still stuck Committing.

    @andrewjstone would know for sure, but I think you're going to be stuck in committing until either:

    * that sled shows up and is able to participate
    
    * you send a new configuration that removes that sled
    

    because the sled you're trying to add has to participate in order for the current epoch (which adds it) to commit?

    Ah, that makes sense. I did successfully remove it from TQ and that epoch committed.

    Since the sled knows it's been expunged from another TQ, I wonder if it could communicate this to Nexus and have Nexus abandon the attempt to add it in that case?

    I'm also not sure how any of this works if the sled was not aware that it had been expunged.

  6. andrewjstone commented on Nov 3, 2026

    @andrewjstone
    Contributor

    Sorry for not commenting earlier. I've been digging into the larger problem of why the sled-agent is running once a sled has been expunged and rebooted. I think #11684 should fix it.

    Since the sled knows it's been expunged from another TQ, I wonder if it could communicate this to Nexus and have Nexus abandon the attempt to add it in that case?

    Sled-agent really shouldn't be running after an expunge and reboot. So it can't talk to Nexus at all. We may be able to get it's status via omdb nexus trust-quorum proxy-status but that's not great from a customer perspective.

  7. andrewjstone commented on Nov 3, 2026

    @andrewjstone
    Contributor

    I tested this on voxel. I started with a 4 node cluster, then removed g2 from the trust quorum. I waited for it to commit.

    Then I logged into g2, which I had not yet rebooted, and checked the status of sled-agent with the new bootstrap API endpoint and the ipadm state, and rebooted:

    root@g2:~# ipadm
    ADDROBJ           TYPE     STATE        ADDR
    lo0/v4            static   ok           127.0.0.1/8
    vioif2/v4         dhcp     ok           192.168.1.70/24
    lo0/v6            static   ok           ::1/128
    vioif0/ll         addrconf ok           fe80::aa40:25ff:fe00:5%vioif0/10
    vioif1/ll         addrconf ok           fe80::aa40:25ff:fe00:6%vioif1/10
    bootstrap0/ll     addrconf ok           fe80::8:20ff:fe1b:c7a3%bootstrap0/10
    bootstrap0/bootstrap6 static ok         fdb0:a840:2500:5::1/64
    underlay0/ll      addrconf ok           fe80::8:20ff:fe61:1698%underlay0/10
    underlay0/sled6   static   ok           fd47:65d2:3fea:103::1/64
    underlay0/internaldns2 static ok        fd47:65d2:3fea:3::2/64
    
    root@g2:~# curl http://[fdb0:a840:2500:5::1]:8080/sled-agent-start-status
    {"state":"started","sled_id":"e2f15c01-cd2f-42de-b2fa-3da5aaec8425"}root@g2:~# reboot
    
    reboot: Halting 10 zones.
    reboot: Completing system halt.
    updating /platform/i86pc/amd64/boot_archive (CPIO)
    Connection to 192.168.1.70 closed by remote host.
    
    

    I then logged back in and did the same thing. The gate held and eventually the state transitioned to expunged. I added some spaces for clarity.

    ➜  voxel git:(main) target/release/voxel host login g2
    [voxel] ssh root@192.168.1.70  (g2 global zone)
    The illumos Project     helios-3.0.23976        May 2026
    root@g2:~# ipadm show-addr -p -o addr 2>/dev/null
    127.0.0.1/8
    192.168.1.70/24
    ::1/128
    fe80::aa40:25ff:fe00:5%vioif0/10
    fe80::aa40:25ff:fe00:6%vioif1/10
    fe80::8:20ff:fe3a:ce32%bootstrap0/10
    fdb0:a840:2500:5::1/64
    
    root@g2:~# curl http://[fdb0:a840:2500:5::1]:8080/sled-agent-start-status
    {"state":"waiting_for_rack_unlock","connected_peers":[],"latest_committed_epoch":1}
    root@g2:~# curl http://[fdb0:a840:2500:5::1]:8080/sled-agent-start-status
    {"state":"waiting_for_rack_unlock","connected_peers":[],"latest_committed_epoch":1}
    
    root@g2:~# curl http://[fdb0:a840:2500:5::1]:8080/sled-agent-start-status
    {"state":"expunged","epoch":2,"from":{"part_number":"913-0000019","serial_number":"2FAKE003"}}
    root@g2:~# curl http://[fdb0:a840:2500:5::1]:8080/sled-agent-start-status
    {"state":"expunged","epoch":2,"from":{"part_number":"913-0000019","serial_number":"2FAKE003"}}
    
    root@g2:~# ipadm
    ADDROBJ           TYPE     STATE        ADDR
    lo0/v4            static   ok           127.0.0.1/8
    vioif2/v4         dhcp     ok           192.168.1.70/24
    lo0/v6            static   ok           ::1/128
    vioif0/ll         addrconf ok           fe80::aa40:25ff:fe00:5%vioif0/10
    vioif1/ll         addrconf ok           fe80::aa40:25ff:fe00:6%vioif1/10
    bootstrap0/ll     addrconf ok           fe80::8:20ff:fe3a:ce32%bootstrap0/10
    bootstrap0/bootstrap6 static ok         fdb0:a840:2500:5::1/64
    
  8. andrewjstone commented on Nov 3, 2026

    @andrewjstone
    Contributor

    I realized that the testing I posted above was for #11684

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions