52
52
get (FeatureName ) ->
53
53
case rabbit_ff_registry :get (FeatureName ) of
54
54
init_required ->
55
- _ = rabbit_ff_registry_factory : initialize_registry (),
55
+ initialize_registry (),
56
56
get (FeatureName );
57
57
Ret ->
58
58
Ret
@@ -74,7 +74,7 @@ get(FeatureName) ->
74
74
list (Which ) ->
75
75
case rabbit_ff_registry :list (Which ) of
76
76
init_required ->
77
- _ = rabbit_ff_registry_factory : initialize_registry (),
77
+ initialize_registry (),
78
78
list (Which );
79
79
Ret ->
80
80
Ret
@@ -93,7 +93,7 @@ list(Which) ->
93
93
states () ->
94
94
case rabbit_ff_registry :states () of
95
95
init_required ->
96
- _ = rabbit_ff_registry_factory : initialize_registry (),
96
+ initialize_registry (),
97
97
states ();
98
98
Ret ->
99
99
Ret
@@ -115,7 +115,7 @@ states() ->
115
115
is_supported (FeatureName ) ->
116
116
case rabbit_ff_registry :is_supported (FeatureName ) of
117
117
init_required ->
118
- _ = rabbit_ff_registry_factory : initialize_registry (),
118
+ initialize_registry (),
119
119
is_supported (FeatureName );
120
120
Ret ->
121
121
Ret
@@ -137,7 +137,7 @@ is_supported(FeatureName) ->
137
137
is_enabled (FeatureName ) ->
138
138
case rabbit_ff_registry :is_enabled (FeatureName ) of
139
139
init_required ->
140
- _ = rabbit_ff_registry_factory : initialize_registry (),
140
+ initialize_registry (),
141
141
is_enabled (FeatureName );
142
142
Ret ->
143
143
Ret
@@ -150,8 +150,22 @@ is_enabled(FeatureName) ->
150
150
inventory () ->
151
151
case rabbit_ff_registry :inventory () of
152
152
init_required ->
153
- _ = rabbit_ff_registry_factory : initialize_registry (),
153
+ initialize_registry (),
154
154
inventory ();
155
155
Ret ->
156
156
Ret
157
157
end .
158
+
159
+ initialize_registry () ->
160
+ % % We acquire the feature flags registry reload lock here to make sure we
161
+ % % don't reload the registry in the middle of a cluster join. Indeed, the
162
+ % % registry is reset and feature flags states are copied from a remote
163
+ % % node. Therefore, there is a small window where the registry is not
164
+ % % loaded and the states on disk do not reflect the intent.
165
+ rabbit_ff_registry_factory :acquire_state_change_lock (),
166
+ try
167
+ _ = rabbit_ff_registry_factory :initialize_registry (),
168
+ ok
169
+ after
170
+ rabbit_ff_registry_factory :release_state_change_lock ()
171
+ end .
0 commit comments