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