|
7 | 7 |
|
8 | 8 | -module(rabbit_core_ff). |
9 | 9 |
|
10 | | --export([direct_exchange_routing_v2_enable/1, |
11 | | - listener_records_in_ets_enable/1, |
12 | | - listener_records_in_ets_post_enable/1, |
13 | | - tracking_records_in_ets_enable/1, |
14 | | - tracking_records_in_ets_post_enable/1]). |
15 | | - |
16 | 10 | -rabbit_feature_flag( |
17 | 11 | {classic_mirrored_queue_version, |
18 | 12 | #{desc => "Support setting version for classic mirrored queues", |
19 | | - stability => stable |
| 13 | + stability => required |
20 | 14 | }}). |
21 | 15 |
|
22 | 16 | -rabbit_feature_flag( |
|
30 | 24 | {stream_queue, |
31 | 25 | #{desc => "Support queues of type `stream`", |
32 | 26 | doc_url => "https://www.rabbitmq.com/stream.html", |
33 | | - stability => stable, |
| 27 | + stability => required, |
34 | 28 | depends_on => [quorum_queue] |
35 | 29 | }}). |
36 | 30 |
|
|
63 | 57 | {stream_single_active_consumer, |
64 | 58 | #{desc => "Single active consumer for streams", |
65 | 59 | doc_url => "https://www.rabbitmq.com/stream.html", |
66 | | - stability => stable, |
| 60 | + stability => required, |
67 | 61 | depends_on => [stream_queue] |
68 | 62 | }}). |
69 | 63 |
|
|
76 | 70 | -rabbit_feature_flag( |
77 | 71 | {direct_exchange_routing_v2, |
78 | 72 | #{desc => "v2 direct exchange routing implementation", |
79 | | - stability => stable, |
80 | | - depends_on => [feature_flags_v2, implicit_default_bindings], |
81 | | - callbacks => #{enable => {?MODULE, direct_exchange_routing_v2_enable}} |
| 73 | + stability => required, |
| 74 | + depends_on => [feature_flags_v2, implicit_default_bindings] |
82 | 75 | }}). |
83 | 76 |
|
84 | 77 | -rabbit_feature_flag( |
85 | 78 | {listener_records_in_ets, |
86 | 79 | #{desc => "Store listener records in ETS instead of Mnesia", |
87 | | - stability => stable, |
88 | | - depends_on => [feature_flags_v2], |
89 | | - callbacks => #{enable => |
90 | | - {?MODULE, listener_records_in_ets_enable}, |
91 | | - post_enable => |
92 | | - {?MODULE, listener_records_in_ets_post_enable}} |
| 80 | + stability => required, |
| 81 | + depends_on => [feature_flags_v2] |
93 | 82 | }}). |
94 | 83 |
|
95 | 84 | -rabbit_feature_flag( |
96 | 85 | {tracking_records_in_ets, |
97 | 86 | #{desc => "Store tracking records in ETS instead of Mnesia", |
98 | | - stability => stable, |
99 | | - depends_on => [feature_flags_v2], |
100 | | - callbacks => #{enable => |
101 | | - {?MODULE, tracking_records_in_ets_enable}, |
102 | | - post_enable => |
103 | | - {?MODULE, tracking_records_in_ets_post_enable}} |
| 87 | + stability => required, |
| 88 | + depends_on => [feature_flags_v2] |
104 | 89 | }}). |
105 | 90 |
|
106 | 91 | -rabbit_feature_flag( |
107 | 92 | {classic_queue_type_delivery_support, |
108 | 93 | #{desc => "Bug fix for classic queue deliveries using mixed versions", |
109 | 94 | doc_url => "https://github.com/rabbitmq/rabbitmq-server/issues/5931", |
110 | | - stability => stable, |
| 95 | + stability => required, |
111 | 96 | depends_on => [stream_queue] |
112 | 97 | }}). |
113 | 98 |
|
|
118 | 103 | stability => stable, |
119 | 104 | depends_on => [stream_queue] |
120 | 105 | }}). |
121 | | - |
122 | | -%% ------------------------------------------------------------------- |
123 | | -%% Direct exchange routing v2. |
124 | | -%% ------------------------------------------------------------------- |
125 | | - |
126 | | --spec direct_exchange_routing_v2_enable(Args) -> Ret when |
127 | | - Args :: rabbit_feature_flags:enable_callback_args(), |
128 | | - Ret :: rabbit_feature_flags:enable_callback_ret(). |
129 | | -direct_exchange_routing_v2_enable(#{feature_name := FeatureName}) -> |
130 | | - TableName = rabbit_index_route, |
131 | | - ok = rabbit_table:wait([rabbit_route], _Retry = true), |
132 | | - try |
133 | | - ok = rabbit_table:create( |
134 | | - TableName, rabbit_table:rabbit_index_route_definition()), |
135 | | - case rabbit_table:ensure_table_copy(TableName, node(), ram_copies) of |
136 | | - ok -> |
137 | | - ok = rabbit_binding:populate_index_route_table(); |
138 | | - {error, Err} = Error -> |
139 | | - rabbit_log_feature_flags:error( |
140 | | - "Feature flags: `~ts`: failed to add copy of table ~ts to " |
141 | | - "node ~tp: ~tp", |
142 | | - [FeatureName, TableName, node(), Err]), |
143 | | - Error |
144 | | - end |
145 | | - catch throw:{error, Reason} -> |
146 | | - rabbit_log_feature_flags:error( |
147 | | - "Feature flags: `~ts`: enable callback failure: ~tp", |
148 | | - [FeatureName, Reason]), |
149 | | - {error, Reason} |
150 | | - end. |
151 | | - |
152 | | -%% ------------------------------------------------------------------- |
153 | | -%% Listener records moved from Mnesia to ETS. |
154 | | -%% ------------------------------------------------------------------- |
155 | | - |
156 | | -listener_records_in_ets_enable(#{feature_name := FeatureName}) -> |
157 | | - try |
158 | | - rabbit_misc:execute_mnesia_transaction( |
159 | | - fun () -> |
160 | | - mnesia:lock({table, rabbit_listener}, read), |
161 | | - Listeners = mnesia:select( |
162 | | - rabbit_listener, [{'$1',[],['$1']}]), |
163 | | - lists:foreach( |
164 | | - fun(Listener) -> |
165 | | - ets:insert(rabbit_listener_ets, Listener) |
166 | | - end, Listeners) |
167 | | - end) |
168 | | - catch |
169 | | - throw:{error, {no_exists, rabbit_listener}} -> |
170 | | - ok; |
171 | | - throw:{error, Reason} -> |
172 | | - rabbit_log_feature_flags:error( |
173 | | - "Feature flags: `~ts`: failed to migrate Mnesia table: ~tp", |
174 | | - [FeatureName, Reason]), |
175 | | - {error, Reason} |
176 | | - end. |
177 | | - |
178 | | -listener_records_in_ets_post_enable(#{feature_name := FeatureName}) -> |
179 | | - try |
180 | | - case mnesia:delete_table(rabbit_listener) of |
181 | | - {atomic, ok} -> |
182 | | - ok; |
183 | | - {aborted, {no_exists, _}} -> |
184 | | - ok; |
185 | | - {aborted, Err} -> |
186 | | - rabbit_log_feature_flags:error( |
187 | | - "Feature flags: `~ts`: failed to delete Mnesia table: ~tp", |
188 | | - [FeatureName, Err]), |
189 | | - ok |
190 | | - end |
191 | | - catch |
192 | | - throw:{error, Reason} -> |
193 | | - rabbit_log_feature_flags:error( |
194 | | - "Feature flags: `~ts`: failed to delete Mnesia table: ~tp", |
195 | | - [FeatureName, Reason]), |
196 | | - ok |
197 | | - end. |
198 | | - |
199 | | -tracking_records_in_ets_enable(#{feature_name := FeatureName}) -> |
200 | | - try |
201 | | - rabbit_connection_tracking:migrate_tracking_records(), |
202 | | - rabbit_channel_tracking:migrate_tracking_records() |
203 | | - catch |
204 | | - throw:{error, {no_exists, _}} -> |
205 | | - ok; |
206 | | - throw:{error, Reason} -> |
207 | | - rabbit_log_feature_flags:error("Enabling feature flag ~ts failed: ~tp", |
208 | | - [FeatureName, Reason]), |
209 | | - {error, Reason} |
210 | | - end. |
211 | | - |
212 | | -tracking_records_in_ets_post_enable(#{feature_name := FeatureName}) -> |
213 | | - try |
214 | | - [delete_table(FeatureName, Tab) || |
215 | | - Tab <- rabbit_connection_tracking:get_all_tracked_connection_table_names_for_node(node())], |
216 | | - [delete_table(FeatureName, Tab) || |
217 | | - Tab <- rabbit_channel_tracking:get_all_tracked_channel_table_names_for_node(node())] |
218 | | - catch |
219 | | - throw:{error, Reason} -> |
220 | | - rabbit_log_feature_flags:error("Enabling feature flag ~ts failed: ~tp", |
221 | | - [FeatureName, Reason]), |
222 | | - %% adheres to the callback interface |
223 | | - ok |
224 | | - end. |
225 | | - |
226 | | -delete_table(FeatureName, Tab) -> |
227 | | - case mnesia:delete_table(Tab) of |
228 | | - {atomic, ok} -> |
229 | | - ok; |
230 | | - {aborted, {no_exists, _}} -> |
231 | | - ok; |
232 | | - {aborted, Err} -> |
233 | | - rabbit_log_feature_flags:error("Enabling feature flag ~ts failed to delete mnesia table ~tp: ~tp", |
234 | | - [FeatureName, Tab, Err]), |
235 | | - %% adheres to the callback interface |
236 | | - ok |
237 | | - end. |
0 commit comments