@@ -379,19 +379,42 @@ forget_member_locked(Node, RemoveWhenOffline)
379379 ok -> post_forget_member_locked (Node , RemoveWhenOffline );
380380 _ -> ok
381381 end ,
382- Ret .
382+ Ret ;
383+ forget_member_locked (Node , RemoveWhenOffline )
384+ when is_atom (Node ) andalso Node =:= node () ->
385+ OtherNodes = members () -- [Node ],
386+ forget_member_locked_remotely (OtherNodes , Node , RemoveWhenOffline ).
383387
384- post_forget_member_locked (Node , false = _RemoveWhenOffline ) ->
385- ? LOG_DEBUG (
386- " DB: removing node `~s ` from various Ra clusters" , [Node ],
387- #{domain => ? RMQLOG_DOMAIN_DB }),
388- _ = rabbit_amqqueue :forget_all (Node ),
389- _ = rabbit_quorum_queue :shrink_all (Node ),
390- _ = rabbit_stream_queue :delete_all_replicas (Node ),
391- _ = rabbit_stream_coordinator :forget_node (Node ),
392- rabbit_node_monitor :notify_left_cluster (Node ),
393- ok ;
394- post_forget_member_locked (_Node , true = _RemoveWhenOffline ) ->
388+ forget_member_locked_remotely ([OtherNode | Rest ], Node , RemoveWhenOffline ) ->
389+ try
390+ ? LOG_DEBUG (
391+ " DB: removing cluster member `~ts ` (this node); doing it from "
392+ " remote node `~s `" ,
393+ [Node , OtherNode ],
394+ #{domain => ? RMQLOG_DOMAIN_DB }),
395+ Ret = erpc :call (
396+ OtherNode ,
397+ ? MODULE , forget_member_locked , [Node , RemoveWhenOffline ]),
398+ case Ret of
399+ ok ->
400+ ok ;
401+ Error ->
402+ ? LOG_DEBUG (
403+ " DB: failed to remove cluster member `~ts ` from node "
404+ " `~s `: ~0p " ,
405+ [Node , OtherNode , Error ],
406+ #{domain => ? RMQLOG_DOMAIN_DB }),
407+ forget_member_locked_remotely (Rest , Node , RemoveWhenOffline )
408+ end
409+ catch
410+ _ :Reason ->
411+ ? LOG_DEBUG (
412+ " DB: failed to remove cluster member `~ts ` from node `~s `: ~0p " ,
413+ [Node , OtherNode , Reason ],
414+ #{domain => ? RMQLOG_DOMAIN_DB }),
415+ forget_member_locked_remotely (Rest , Node , RemoveWhenOffline )
416+ end ;
417+ forget_member_locked_remotely ([], _Node , _RemoveWhenOffline ) ->
395418 ok .
396419
397420forget_member_using_mnesia (Node , RemoveWhenOffline ) ->
@@ -406,6 +429,19 @@ forget_member_using_khepri(_Node, true) ->
406429forget_member_using_khepri (Node , false = _RemoveWhenOffline ) ->
407430 rabbit_khepri :remove_member (Node ).
408431
432+ post_forget_member_locked (Node , false = _RemoveWhenOffline ) ->
433+ ? LOG_DEBUG (
434+ " DB: removing node `~s ` from various Ra clusters" , [Node ],
435+ #{domain => ? RMQLOG_DOMAIN_DB }),
436+ _ = rabbit_amqqueue :forget_all (Node ),
437+ _ = rabbit_quorum_queue :shrink_all (Node ),
438+ _ = rabbit_stream_queue :delete_all_replicas (Node ),
439+ _ = rabbit_stream_coordinator :forget_node (Node ),
440+ rabbit_node_monitor :notify_left_cluster (Node ),
441+ ok ;
442+ post_forget_member_locked (_Node , true = _RemoveWhenOffline ) ->
443+ ok .
444+
409445lock_cluster_changes (ChangingNode ) ->
410446 RabbitWasRunning = stop_rabbit_if_running (ChangingNode ),
411447 InitialState = #{changing_node => ChangingNode ,
0 commit comments