diff --git a/src/mero.erl b/src/mero.erl index 0f31052..d4fe64c 100644 --- a/src/mero.erl +++ b/src/mero.erl @@ -35,7 +35,7 @@ gets/2, gets/3, delete/3, mdelete/3, mget/2, mget/3, mgets/2, mgets/3, set/5, mset/3, cas/6, mcas/3, add/5, madd/3, flush_all/1, shard_phash2/2, shard_crc32/2, clustering_key/1, storage_key/1]). --export([state/0, state/1, deep_state/0, deep_state/1]). +-export([state/0, state/1, deep_state/0, deep_state/1, is_cluster_available/1]). -include_lib("mero/include/mero.hrl"). @@ -354,3 +354,25 @@ deep_state(ClusterName) -> %% @doc: Returns the state of the sockets for all clusters deep_state() -> [{Cluster, deep_state(Cluster)} || Cluster <- mero_cluster:clusters()]. + +%% @doc: Returns current availability of a cluster +-spec is_cluster_available(atom()) -> true | {false, atom()}. +is_cluster_available(ClusterName) -> + try + Clusters = mero_cluster:clusters(), + case lists:member(ClusterName, Clusters) of + false -> + {false, cluster_not_found}; + true -> + true + end + catch + error:undef -> + {false, cluster_util_not_loaded}; + error:function_clause -> + {false, invalid_sharding_algorithm}; + error:badarg -> + {false, invalid_sharding_algorithm}; + _:_ -> + {false, cluster_config_error} + end. diff --git a/test/mero_SUITE.erl b/test/mero_SUITE.erl index e416ee8..2b99e7a 100644 --- a/test/mero_SUITE.erl +++ b/test/mero_SUITE.erl @@ -38,7 +38,7 @@ increase_counter_clustered_key/1, increment/1, mdelete/1, multiget_defineds/1, multiget_defineds_clustered_keys/1, multiget_undefineds/1, set/1, undefined_counter/1, mincrease_counter/1, cas/1, madd/1, mset/1, mcas/1, state_ok/1, state_error/1, - state_timeout/1, get_clustered_key/1]). + state_timeout/1, get_clustered_key/1, cluster_availability/1]). %%%============================================================================= %%% common_test callbacks @@ -66,7 +66,8 @@ groups() -> cas, state_ok, state_error, - state_timeout]}, + state_timeout, + cluster_availability]}, {binary_protocol, [shuffle, {repeat_until_any_fail, 1}], [add, @@ -89,7 +90,8 @@ groups() -> mcas, state_ok, state_error, - state_timeout]}]. + state_timeout, + cluster_availability]}]. init_per_group(text_protocol, Config) -> ClusterConfig = @@ -525,6 +527,11 @@ state_timeout(_) -> lists:sort( proplists:get_value(cluster, State))). +cluster_availability(_) -> + ?assertEqual(true, mero:is_cluster_available(cluster)), + ?assertEqual(true, mero:is_cluster_available(cluster2)), + ?assertEqual({false, cluster_not_found}, mero:is_cluster_available(non_existing_cluster)). + %%%============================================================================= %%% Internal functions %%%=============================================================================