5252get (FeatureName ) ->
5353 case rabbit_ff_registry :get (FeatureName ) of
5454 init_required ->
55- _ = rabbit_ff_registry_factory : initialize_registry (),
55+ initialize_registry (),
5656 get (FeatureName );
5757 Ret ->
5858 Ret
@@ -74,7 +74,7 @@ get(FeatureName) ->
7474list (Which ) ->
7575 case rabbit_ff_registry :list (Which ) of
7676 init_required ->
77- _ = rabbit_ff_registry_factory : initialize_registry (),
77+ initialize_registry (),
7878 list (Which );
7979 Ret ->
8080 Ret
@@ -93,7 +93,7 @@ list(Which) ->
9393states () ->
9494 case rabbit_ff_registry :states () of
9595 init_required ->
96- _ = rabbit_ff_registry_factory : initialize_registry (),
96+ initialize_registry (),
9797 states ();
9898 Ret ->
9999 Ret
@@ -115,7 +115,7 @@ states() ->
115115is_supported (FeatureName ) ->
116116 case rabbit_ff_registry :is_supported (FeatureName ) of
117117 init_required ->
118- _ = rabbit_ff_registry_factory : initialize_registry (),
118+ initialize_registry (),
119119 is_supported (FeatureName );
120120 Ret ->
121121 Ret
@@ -137,7 +137,7 @@ is_supported(FeatureName) ->
137137is_enabled (FeatureName ) ->
138138 case rabbit_ff_registry :is_enabled (FeatureName ) of
139139 init_required ->
140- _ = rabbit_ff_registry_factory : initialize_registry (),
140+ initialize_registry (),
141141 is_enabled (FeatureName );
142142 Ret ->
143143 Ret
@@ -150,8 +150,22 @@ is_enabled(FeatureName) ->
150150inventory () ->
151151 case rabbit_ff_registry :inventory () of
152152 init_required ->
153- _ = rabbit_ff_registry_factory : initialize_registry (),
153+ initialize_registry (),
154154 inventory ();
155155 Ret ->
156156 Ret
157157 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