@@ -1055,7 +1055,7 @@ collect_inventory_on_nodes(Nodes, Timeout) ->
10551055 Inventory0 = #{feature_flags => #{},
10561056 applications_per_node => #{},
10571057 states_per_node => #{}},
1058- Rets = rpc_calls (Nodes , rabbit_ff_registry , inventory , [] , Timeout ),
1058+ Rets = inventory_rpcs (Nodes , Timeout ),
10591059 maps :fold (
10601060 fun
10611061 (Node ,
@@ -1081,6 +1081,46 @@ collect_inventory_on_nodes(Nodes, Timeout) ->
10811081 Error
10821082 end , {ok , Inventory0 }, Rets ).
10831083
1084+ inventory_rpcs (Nodes , Timeout ) ->
1085+ % % We must use `rabbit_ff_registry_wrapper' if it is available to avoid
1086+ % % any deadlock with the Code server. If it is unavailable, we fall back
1087+ % % to `rabbit_ff_registry'.
1088+ % %
1089+ % % See commit aacfa1978e24bcacd8de7d06a7c3c5d9d8bd098e and pull request
1090+ % % #8155.
1091+ Rets0 = rpc_calls (
1092+ Nodes ,
1093+ rabbit_ff_registry_wrapper , inventory , [], Timeout ),
1094+ OlderNodes = maps :fold (
1095+ fun
1096+ (Node ,
1097+ {error ,
1098+ {exception , undef ,
1099+ [{rabbit_ff_registry_wrapper ,_ , _ , _ } | _ ]}},
1100+ Acc ) ->
1101+ [Node | Acc ];
1102+ (_Node , _Ret , Acc ) ->
1103+ Acc
1104+ end , [], Rets0 ),
1105+ case OlderNodes of
1106+ [] ->
1107+ Rets0 ;
1108+ _ ->
1109+ ? LOG_INFO (
1110+ " Feature flags: the following nodes run an older version of "
1111+ " RabbitMQ causing the "
1112+ " \" rabbit_ff_registry_wrapper:inventory[] undefined\" error "
1113+ " above: ~2p~n "
1114+ " Feature flags: falling back to another method for those "
1115+ " nodes; this may trigger a bug causing them to hang" ,
1116+ [lists :sort (OlderNodes )],
1117+ #{domain => ? RMQLOG_DOMAIN_FEAT_FLAGS }),
1118+ Rets1 = rpc_calls (
1119+ OlderNodes ,
1120+ rabbit_ff_registry , inventory , [], Timeout ),
1121+ maps :merge (Rets0 , Rets1 )
1122+ end .
1123+
10841124merge_feature_flags (FeatureFlagsA , FeatureFlagsB ) ->
10851125 FeatureFlags = maps :merge (FeatureFlagsA , FeatureFlagsB ),
10861126 maps :map (
0 commit comments