@@ -341,26 +341,31 @@ apply(#{index := _Idx} = Meta0, {_CmdTag, StreamId, #{}} = Cmd,
341
341
monitors = Monitors0 } = State0 ) ->
342
342
Stream0 = maps :get (StreamId , Streams0 , undefined ),
343
343
Meta = maps :without ([term , machine_version ], Meta0 ),
344
- Stream1 = update_stream (Meta , Cmd , Stream0 ),
345
- Reply = case Stream1 of
346
- # stream {reply_to = undefined } ->
347
- ok ;
344
+ case filter_command (Meta , Cmd , Stream0 ) of
345
+ ok ->
346
+ Stream1 = update_stream (Meta , Cmd , Stream0 ),
347
+ Reply = case Stream1 of
348
+ # stream {reply_to = undefined } ->
349
+ ok ;
350
+ _ ->
351
+ % % reply_to is set so we'll reply later
352
+ '$ra_no_reply'
353
+ end ,
354
+ case Stream1 of
355
+ undefined ->
356
+ return (Meta , State0 #? MODULE {streams = maps :remove (StreamId , Streams0 )},
357
+ Reply , []);
348
358
_ ->
349
- % % reply_to is set so we'll reply later
350
- '$ra_no_reply'
351
- end ,
352
- case Stream1 of
353
- undefined ->
354
- return (Meta , State0 #? MODULE {streams = maps :remove (StreamId , Streams0 )},
355
- Reply , []);
356
- _ ->
357
- {Stream2 , Effects0 } = evaluate_stream (Meta , Stream1 , []),
358
- {Stream3 , Effects1 } = eval_listeners (Stream2 , Effects0 ),
359
- {Stream , Effects2 } = eval_retention (Meta , Stream3 , Effects1 ),
360
- {Monitors , Effects } = ensure_monitors (Stream , Monitors0 , Effects2 ),
361
- return (Meta ,
362
- State0 #? MODULE {streams = Streams0 #{StreamId => Stream },
363
- monitors = Monitors }, Reply , Effects )
359
+ {Stream2 , Effects0 } = evaluate_stream (Meta , Stream1 , []),
360
+ {Stream3 , Effects1 } = eval_listeners (Stream2 , Effects0 ),
361
+ {Stream , Effects2 } = eval_retention (Meta , Stream3 , Effects1 ),
362
+ {Monitors , Effects } = ensure_monitors (Stream , Monitors0 , Effects2 ),
363
+ return (Meta ,
364
+ State0 #? MODULE {streams = Streams0 #{StreamId => Stream },
365
+ monitors = Monitors }, Reply , Effects )
366
+ end ;
367
+ Reply ->
368
+ return (Meta , State0 , Reply , [])
364
369
end ;
365
370
apply (Meta , {down , Pid , Reason } = Cmd ,
366
371
#? MODULE {streams = Streams0 ,
@@ -874,6 +879,23 @@ make_ra_conf(Node, Nodes) ->
874
879
machine => {module , ? MODULE , #{}},
875
880
ra_event_formatter => Formatter }.
876
881
882
+ filter_command (_Meta , {delete_replica , _ , #{node := Node }}, # stream {members = Members0 }) ->
883
+ Members = maps :filter (fun (_ , # member {target = S }) when S =/= deleted ->
884
+ true ;
885
+ (_ , _ ) ->
886
+ false
887
+ end , Members0 ),
888
+ case maps :size (Members ) =< 1 of
889
+ true ->
890
+ rabbit_log :warning (
891
+ " ~s failed to delete ~p replica, last cluster member" ,
892
+ [? MODULE , Node ]),
893
+ {error , last_stream_member };
894
+ false ->
895
+ ok
896
+ end ;
897
+ filter_command (_ , _ , _ ) ->
898
+ ok .
877
899
878
900
update_stream (Meta , Cmd , Stream ) ->
879
901
try
@@ -1536,6 +1558,7 @@ set_running_to_stopped(Members) ->
1536
1558
(_ , M ) ->
1537
1559
M
1538
1560
end , Members ).
1561
+
1539
1562
- ifdef (TEST ).
1540
1563
- include_lib (" eunit/include/eunit.hrl" ).
1541
1564
- endif .
0 commit comments