diff --git a/service/topology_coordinator.cc b/service/topology_coordinator.cc index 573d74fb11..c96f9a8331 100644 --- a/service/topology_coordinator.cc +++ b/service/topology_coordinator.cc @@ -385,9 +385,12 @@ class topology_coordinator : public endpoint_lifecycle_subscriber { const std::unordered_set& exclude_nodes, drop_guard_and_retake drop_and_retake = drop_guard_and_retake::yes) { rtlogger.info("executing global topology command {}, excluded nodes: {}", cmd.cmd, exclude_nodes); - auto nodes = _topo_sm._topology.normal_nodes - | boost::adaptors::filtered([&exclude_nodes] (const std::pair& n) { - return !exclude_nodes.contains(n.first); + auto nodes = boost::range::join(_topo_sm._topology.normal_nodes, _topo_sm._topology.transition_nodes) + | boost::adaptors::filtered([&cmd, &exclude_nodes] (const std::pair& n) { + // We must send barrier_and_drain to the decommissioning node as it might be coordinating requests. + bool drain_decommissioning_node = cmd.cmd == raft_topology_cmd::command::barrier_and_drain + && (n.second.state == node_state::decommissioning || n.second.state == node_state::left_token_ring); + return !exclude_nodes.contains(n.first) && (n.second.state == node_state::normal || drain_decommissioning_node); }) | boost::adaptors::map_keys; if (drop_and_retake) {