Skip to content

Commit 2576c34

Browse files
[multicast] Remove recovery path and update to latest dendrite
This incorporates oxidecomputer/dendrite#232 and oxidecomputer/dendrite#195. Note: No API changes here.
1 parent 836493d commit 2576c34

6 files changed

Lines changed: 32 additions & 128 deletions

File tree

‎Cargo.lock‎

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

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ digest = "0.10.7"
477477
dns-server = { path = "dns-server" }
478478
dns-server-api = { path = "dns-server-api" }
479479
dns-service-client = { path = "clients/dns-service-client" }
480-
dpd-client = { git = "https://github.com/oxidecomputer/dendrite", rev = "c0bf0a3b536baab0393c96fec3204b32e4f9368b" }
480+
dpd-client = { git = "https://github.com/oxidecomputer/dendrite", rev = "b31ba90d14636ef6bba9dbb56d756efa249d4b4e" }
481481
dropshot = { version = "0.16.6", features = [ "usdt-probes" ] }
482482
dropshot-api-manager = "0.5.2"
483483
dropshot-api-manager-types = "0.5.2"

‎nexus/src/app/multicast/dataplane.rs‎

Lines changed: 15 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use std::net::IpAddr;
4343

4444
use futures::future::try_join_all;
4545
use oxnet::MulticastMac;
46-
use slog::{Logger, debug, error, info, warn};
46+
use slog::{Logger, debug, error, info};
4747

4848
use dpd_client::Error as DpdError;
4949
use dpd_client::types::{
@@ -927,116 +927,20 @@ impl MulticastDataplaneClient {
927927
&underlay_ip_admin, &tag, &update_entry)
928928
.await;
929929

930-
match update_res {
931-
Ok(_) => {}
932-
Err(DpdError::ErrorResponse(ref resp))
933-
if resp.status() == reqwest::StatusCode::NOT_FOUND
934-
|| resp.status()
935-
== reqwest::StatusCode::INTERNAL_SERVER_ERROR =>
936-
{
937-
// 404: Group disappeared (race or external cleanup)
938-
// 500: ASIC state inconsistent with DPD DB
939-
//
940-
// In both cases, delete and recreate with the updated members.
941-
info!(
942-
log,
943-
"underlay update failed, attempting delete+recreate";
944-
"underlay_ip" => %underlay_ip,
945-
"switch" => %switch_slot,
946-
"operation" => %operation_name,
947-
"status" => %resp.status(),
948-
"dpd_operation" => "modify_group_membership_recreate"
949-
);
950-
951-
// TODO: this `reset_by_tag` fallback can be removed
952-
// once DPD's `modify_group_internal` calls
953-
// `process_membership_changes` in the
954-
// empty-transition arm, preventing the 500 that
955-
// triggers this recovery path.
956-
// See https://github.com/oxidecomputer/dendrite/pull/232
957-
//
958-
// Try to delete the stale underlay group. If this
959-
// fails because the underlay group is still
960-
// referenced by an external group via NAT target,
961-
// fall back to `reset_by_tag`, which deletes
962-
// external groups first so the ASIC state is clean
963-
// for the next reconciler pass.
964-
if let Err(del_err) = client
965-
.multicast_group_delete(&underlay_ip, &tag)
966-
.await
967-
{
968-
warn!(
969-
log,
970-
"underlay delete failed, resetting all \
971-
groups by tag for clean ASIC state";
972-
"underlay_ip" => %underlay_ip,
973-
"switch" => %switch_slot,
974-
"delete_error" => %del_err,
975-
"dpd_operation" => "modify_group_membership_recreate"
976-
);
977-
978-
if let Err(reset_err) = client
979-
.multicast_reset_by_tag(&tag)
980-
.await
981-
{
982-
error!(
983-
log,
984-
"tag reset also failed during recovery";
985-
"underlay_ip" => %underlay_ip,
986-
"switch" => %switch_slot,
987-
"error" => %reset_err,
988-
"dpd_operation" => "modify_group_membership_recreate"
989-
);
990-
}
991-
992-
// Return error so the reconciler retries.
993-
// Drift correction will recreate the groups
994-
// with clean ASIC state on the next pass.
995-
return Err(Error::internal_error(&format!(
996-
"underlay group recovery on {switch_slot}: \
997-
reset by tag after delete failed ({del_err})"
998-
)));
999-
}
1000-
1001-
// Recreate with the updated members
1002-
let create_entry = MulticastGroupCreateUnderlayEntry {
1003-
group_ip: underlay_ip_admin.clone(),
1004-
members: update_entry.members,
1005-
tag: underlay_group.tag.clone(),
1006-
};
1007-
1008-
client
1009-
.multicast_group_create_underlay(&create_entry)
1010-
.await
1011-
.map_err(|e| {
1012-
error!(
1013-
log,
1014-
"underlay recreate with members failed";
1015-
"underlay_ip" => %underlay_ip,
1016-
"switch" => %switch_slot,
1017-
"error" => %e,
1018-
"dpd_operation" => "modify_group_membership_recreate"
1019-
);
1020-
Error::internal_error(&format!(
1021-
"underlay recreate with members failed on {switch_slot}: {e}"
1022-
))
1023-
})?;
1024-
}
1025-
Err(e) => {
1026-
error!(
1027-
log,
1028-
"underlay member modify failed";
1029-
"operation_name" => %operation_name,
1030-
"underlay_ip" => %underlay_ip,
1031-
"switch" => %switch_slot,
1032-
"error" => %e,
1033-
"dpd_operation" => "modify_group_membership_update"
1034-
);
1035-
return Err(Error::internal_error(&format!(
1036-
"underlay member modify failed on {switch_slot}: {e}"
1037-
)));
1038-
}
1039-
}
930+
update_res.map_err(|e| {
931+
error!(
932+
log,
933+
"underlay member modify failed";
934+
"operation_name" => %operation_name,
935+
"underlay_ip" => %underlay_ip,
936+
"switch" => %switch_slot,
937+
"error" => %e,
938+
"dpd_operation" => "modify_group_membership_update"
939+
);
940+
Error::internal_error(&format!(
941+
"underlay member modify failed on {switch_slot}: {e}"
942+
))
943+
})?;
1040944

1041945
info!(
1042946
log,

‎package-manifest.toml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,8 @@ only_for_targets.image = "standard"
748748
# the other `source.*` keys.
749749
source.type = "prebuilt"
750750
source.repo = "dendrite"
751-
source.commit = "c0bf0a3b536baab0393c96fec3204b32e4f9368b"
752-
source.sha256 = "28a7670be35a68ff3e52b3e5e57f4fa6b8465e3ec8a21314b09381fb213d3a3e"
751+
source.commit = "b31ba90d14636ef6bba9dbb56d756efa249d4b4e"
752+
source.sha256 = "31a8e71c9b83a1739738f715d41d1b254e99030d8dacb5632ff703e47a05a4a5"
753753
output.type = "zone"
754754
output.intermediate_only = true
755755

@@ -775,8 +775,8 @@ only_for_targets.image = "standard"
775775
# the other `source.*` keys.
776776
source.type = "prebuilt"
777777
source.repo = "dendrite"
778-
source.commit = "c0bf0a3b536baab0393c96fec3204b32e4f9368b"
779-
source.sha256 = "8070af15f48316ace21e6bb339ba4a1fb2219256a9a017cdbe85505f66aa08ad"
778+
source.commit = "b31ba90d14636ef6bba9dbb56d756efa249d4b4e"
779+
source.sha256 = "d86081a688ccb59df2439b4f3ee224b84f095de7a09cac8613ba75ed0ef41d56"
780780
output.type = "zone"
781781
output.intermediate_only = true
782782

@@ -795,8 +795,8 @@ only_for_targets.image = "standard"
795795
# the other `source.*` keys.
796796
source.type = "prebuilt"
797797
source.repo = "dendrite"
798-
source.commit = "c0bf0a3b536baab0393c96fec3204b32e4f9368b"
799-
source.sha256 = "69018db9c5f2d8878a8bc8dec26049679e8ece0e7d66e742c2e573c3484f8c29"
798+
source.commit = "b31ba90d14636ef6bba9dbb56d756efa249d4b4e"
799+
source.sha256 = "4eb8ad0a9e6564858716db9170e449d9d427c7427ee5241b13f72213b5eaf5a4"
800800
output.type = "zone"
801801
output.intermediate_only = true
802802

‎tools/dendrite_stub_checksums‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
CIDL_SHA256_ILLUMOS="28a7670be35a68ff3e52b3e5e57f4fa6b8465e3ec8a21314b09381fb213d3a3e"
2-
CIDL_SHA256_LINUX_DPD="c68ea190f27e9526aa1fba1cc9d1416778d536c805c53c469ee62f603cc433fb"
1+
CIDL_SHA256_ILLUMOS="31a8e71c9b83a1739738f715d41d1b254e99030d8dacb5632ff703e47a05a4a5"
2+
CIDL_SHA256_LINUX_DPD="ab6a66ec4e6571b020496cf2a5abf2107416951e93ec7c6a1d0ca708697ee718"
33
CIDL_SHA256_LINUX_SWADM="a2826dbdb9b3001cf35756e6ae77dbc9f43a5732932528a0b7cf482d0e0cb237"

‎tools/dendrite_version‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
COMMIT="c0bf0a3b536baab0393c96fec3204b32e4f9368b"
1+
COMMIT="b31ba90d14636ef6bba9dbb56d756efa249d4b4e"

0 commit comments

Comments
 (0)