@@ -43,7 +43,7 @@ use std::net::IpAddr;
4343
4444use futures:: future:: try_join_all;
4545use oxnet:: MulticastMac ;
46- use slog:: { Logger , debug, error, info, warn } ;
46+ use slog:: { Logger , debug, error, info} ;
4747
4848use dpd_client:: Error as DpdError ;
4949use 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" => %location,
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" => %location,
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" => %location,
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 {location}: \
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" => %location,
1017- "error" => %e,
1018- "dpd_operation" => "modify_group_membership_recreate"
1019- ) ;
1020- Error :: internal_error ( & format ! (
1021- "underlay recreate with members failed on {location}: {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" => %location,
1032- "error" => %e,
1033- "dpd_operation" => "modify_group_membership_update"
1034- ) ;
1035- return Err ( Error :: internal_error ( & format ! (
1036- "underlay member modify failed on {location}: {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" => %location,
937+ "error" => %e,
938+ "dpd_operation" => "modify_group_membership_update"
939+ ) ;
940+ Error :: internal_error ( & format ! (
941+ "underlay member modify failed on {location}: {e}"
942+ ) )
943+ } ) ?;
1040944
1041945 info ! (
1042946 log,
0 commit comments