20
20
tick /2 ,
21
21
version /0 ,
22
22
which_module /1 ,
23
- overview /1 ,
23
+ overview /1 ]).
24
+
25
+ -export ([update_config /2 ,
24
26
policy_changed /1 ]).
25
27
26
28
% % coordinator API
@@ -236,16 +238,38 @@ delete_replica(StreamId, Node) ->
236
238
237
239
policy_changed (Q ) when ? is_amqqueue (Q ) ->
238
240
StreamId = maps :get (name , amqqueue :get_type_state (Q )),
241
+ Config = rabbit_stream_queue :update_stream_conf (Q , #{}),
242
+ case update_config (Q , Config ) of
243
+ {ok , ok , _ } = Res ->
244
+ Res ;
245
+ {error , feature_not_enabled } ->
246
+ % % backwards compatibility
247
+ % % TODO: remove in future
248
+ process_command ({policy_changed , StreamId , #{queue => Q }});
249
+ Err ->
250
+ Err
251
+ end .
252
+
253
+ -spec update_config (amqqueue :amqqueue (), #{atom () => term ()}) ->
254
+ {ok , ok , ra :server_id ()} | {error , not_supported | term ()}.
255
+ update_config (Q , Config )
256
+ when ? is_amqqueue (Q ) andalso is_map (Config ) ->
239
257
case rabbit_feature_flags :is_enabled (stream_update_config_command ) of
240
258
true ->
241
- % % there are the only two configuration keys that are safe to
259
+ % % there are the only a few configuration keys that are safe to
242
260
% % update
243
- Conf = maps :with ([filter_size ,
244
- retention ],
245
- rabbit_stream_queue :update_stream_conf (Q , #{})),
246
- process_command ({update_config , StreamId , Conf });
261
+ StreamId = maps :get (name , amqqueue :get_type_state (Q )),
262
+ case maps :with ([filter_size ,
263
+ retention ,
264
+ writer_mod ,
265
+ replica_mod ], Config ) of
266
+ Conf when map_size (Conf ) > 0 ->
267
+ process_command ({update_config , StreamId , Conf });
268
+ _ ->
269
+ {error , no_updatable_keys }
270
+ end ;
247
271
false ->
248
- process_command ({ policy_changed , StreamId , #{ queue => Q }})
272
+ { error , feature_not_enabled }
249
273
end .
250
274
251
275
sac_state (#? MODULE {single_active_consumer = SacState }) ->
@@ -1016,7 +1040,7 @@ phase_start_replica(StreamId, #{epoch := Epoch,
1016
1040
{error , already_present } ->
1017
1041
% % need to remove child record if this is the case
1018
1042
% % can it ever happen?
1019
- _ = osiris_replica : stop (Node , Conf0 ),
1043
+ _ = osiris : stop_member (Node , Conf0 ),
1020
1044
send_action_failed (StreamId , starting , Args );
1021
1045
{error , {already_started , Pid }} ->
1022
1046
% % TODO: we need to check that the current epoch is the same
@@ -1049,7 +1073,7 @@ phase_delete_member(StreamId, #{node := Node} = Arg, Conf) ->
1049
1073
fun () ->
1050
1074
case rabbit_nodes :is_member (Node ) of
1051
1075
true ->
1052
- try osiris_server_sup : delete_child (Node , Conf ) of
1076
+ try osiris : delete_member (Node , Conf ) of
1053
1077
ok ->
1054
1078
rabbit_log :info (" ~ts : Member deleted for ~ts : on node ~ts " ,
1055
1079
[? MODULE , StreamId , Node ]),
@@ -1071,10 +1095,9 @@ phase_delete_member(StreamId, #{node := Node} = Arg, Conf) ->
1071
1095
end
1072
1096
end .
1073
1097
1074
- phase_stop_member (StreamId , #{node := Node ,
1075
- epoch := Epoch } = Arg0 , Conf ) ->
1098
+ phase_stop_member (StreamId , #{node := Node , epoch := Epoch } = Arg0 , Conf ) ->
1076
1099
fun () ->
1077
- try osiris_server_sup : stop_child (Node , StreamId ) of
1100
+ try osiris_member : stop (Node , Conf ) of
1078
1101
ok ->
1079
1102
% % get tail
1080
1103
try get_replica_tail (Node , Conf ) of
@@ -1093,13 +1116,7 @@ phase_stop_member(StreamId, #{node := Node,
1093
1116
[? MODULE , StreamId , Node , Epoch , Err ]),
1094
1117
maybe_sleep (Err ),
1095
1118
send_action_failed (StreamId , stopping , Arg0 )
1096
- end ;
1097
- Err ->
1098
- rabbit_log :warning (" ~ts : failed to stop "
1099
- " member ~ts ~w Error: ~w " ,
1100
- [? MODULE , StreamId , Node , Err ]),
1101
- maybe_sleep (Err ),
1102
- send_action_failed (StreamId , stopping , Arg0 )
1119
+ end
1103
1120
catch _ :Err ->
1104
1121
rabbit_log :warning (" ~ts : failed to stop member ~ts ~w Error: ~w " ,
1105
1122
[? MODULE , StreamId , Node , Err ]),
@@ -1108,10 +1125,9 @@ phase_stop_member(StreamId, #{node := Node,
1108
1125
end
1109
1126
end .
1110
1127
1111
- phase_start_writer (StreamId , #{epoch := Epoch ,
1112
- node := Node } = Args0 , Conf ) ->
1128
+ phase_start_writer (StreamId , #{epoch := Epoch , node := Node } = Args0 , Conf ) ->
1113
1129
fun () ->
1114
- try osiris_writer : start (Conf ) of
1130
+ try osiris : start_writer (Conf ) of
1115
1131
{ok , Pid } ->
1116
1132
Args = Args0 #{epoch => Epoch , pid => Pid },
1117
1133
rabbit_log :info (" ~ts : started writer ~ts on ~w in ~b " ,
@@ -2019,7 +2035,6 @@ make_writer_conf(Node, #stream{epoch = Epoch,
2019
2035
replica_nodes => lists :delete (Node , Nodes ),
2020
2036
epoch => Epoch }.
2021
2037
2022
-
2023
2038
find_leader (Members ) ->
2024
2039
case lists :partition (
2025
2040
fun ({_ , # member {target = deleted }}) ->
0 commit comments