|
23 | 23 | filter_running/1, filter_not_running/1,
|
24 | 24 | is_serving/1, list_serving/0, list_not_serving/0,
|
25 | 25 | filter_serving/1, filter_not_serving/1,
|
| 26 | + list_serving_with_plugin/1, filter_with_plugin/2, |
26 | 27 | name_type/0, running_count/0, total_count/0,
|
27 | 28 | await_running_count/2, is_single_node_cluster/0,
|
28 | 29 | boot/0]).
|
@@ -457,10 +458,63 @@ filter_not_serving(Nodes) ->
|
457 | 458 | Serving = do_filter_serving(Members),
|
458 | 459 | Members -- Serving.
|
459 | 460 |
|
| 461 | +%% @doc Combined list_serving/0 and rabbit_plugins:is_enabled_on_node/2 |
| 462 | +%% to return nodes that are running, not under maintenance mode |
| 463 | +%% and have a specific plugin enabled. |
| 464 | +%% @see list_serving/0 |
| 465 | +%% @see rabbit_plugins:is_enabled_on_node/2 |
| 466 | +-spec list_serving_with_plugin(PluginName :: rabbit_plugins:plugin_name()) -> [node()]. |
| 467 | +list_serving_with_plugin(PluginName) -> |
| 468 | + Members = list_serving(), |
| 469 | + filter_with_plugin(PluginName, Members). |
| 470 | + |
| 471 | +%% @doc Filters the given list of nodes to only select those belonging to the |
| 472 | +%% cluster and having a specific plugin enabled. |
| 473 | +%% |
| 474 | +%% The cluster being considered is the one which the node running this |
| 475 | +%% function belongs to. |
| 476 | +%% |
| 477 | +%% @see filter_serving/1. |
| 478 | +-spec filter_with_plugin(rabbit_plugins:plugin_name(), [node()]) -> [node()]. |
| 479 | +filter_with_plugin(PluginName, Nodes) -> |
| 480 | + Members = filter_members(Nodes), |
| 481 | + do_filter_with_plugin(PluginName, Members). |
| 482 | + |
| 483 | + |
| 484 | +%% @doc Filters the given list of cluster members to only select those who |
| 485 | +%% accept clients. |
| 486 | +%% |
| 487 | +%% The given list of nodes must have been verified to only contain cluster |
| 488 | +%% members. |
| 489 | +%% |
| 490 | +%% @private |
| 491 | + |
| 492 | +do_filter_with_plugin(PluginName, Members) -> |
| 493 | + %% All clustered members having a specific plugin enabled |
| 494 | + Rets = erpc:multicall( |
| 495 | + Members, rabbit_plugins, is_enabled, [PluginName], ?FILTER_RPC_TIMEOUT), |
| 496 | + RetPerMember = lists:zip(Members, Rets), |
| 497 | + lists:filtermap( |
| 498 | + fun |
| 499 | + ({Member, {ok, true}}) -> |
| 500 | + {true, Member}; |
| 501 | + ({_, {ok, false}}) -> |
| 502 | + false; |
| 503 | + ({_, {error, {erpc, Reason}}}) |
| 504 | + when Reason =:= noconnection orelse Reason =:= timeout -> |
| 505 | + false; |
| 506 | + ({Member, Error}) -> |
| 507 | + ?LOG_ERROR( |
| 508 | + "~s:~s: Failed to query node ~ts: ~p", |
| 509 | + [?MODULE, ?FUNCTION_NAME, Member, Error], |
| 510 | + #{domain => ?RMQLOG_DOMAIN_GLOBAL}), |
| 511 | + false |
| 512 | + end, RetPerMember). |
| 513 | + |
460 | 514 | -spec do_filter_serving(Members) -> Members when
|
461 | 515 | Members :: [node()].
|
462 | 516 | %% @doc Filters the given list of cluster members to only select those who
|
463 |
| -%% accept clients. |
| 517 | +%% accept client connections. |
464 | 518 | %%
|
465 | 519 | %% The given list of nodes must have been verified to only contain cluster
|
466 | 520 | %% members.
|
|
0 commit comments