Skip to content

Instantly share code, notes, and snippets.

@buddhisthead
Last active December 26, 2015 06:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save buddhisthead/7111197 to your computer and use it in GitHub Desktop.
Save buddhisthead/7111197 to your computer and use it in GitHub Desktop.
rpc:multicall(erlang, apply, [fun() -> riak_core_cluster_mgr:register_member_fun( fun({IP, Port}) -> CIDRFun = fun(FunR, <<>>, Acc) -> Acc; (FunR, <<X:1/bits, Rest/bits>>, Acc) -> case X of <<1:1>> -> FunR(FunR, Rest, Acc + 1); _ -> FunR(FunR, Rest, Acc) end end, MaskAddress = fun(Addr={_, _, _, _}, Maskbits) -> B = list_to_binary(tuple_to_list(Addr)), <<Subnet:Maskbits, _Host/bitstring>> = B, Subnet; (_, _) -> undefined end, {ok, MyIPs} = inet:getifaddrs(), {ok, NormIP} = riak_repl_util:normalize_ip(IP), MyMask = lists:foldl( fun({_IF, Attrs}, Acc) -> case lists:member({addr, NormIP}, Attrs) of true -> NetMask = lists:foldl(fun({netmask, NM = {_, _, _, _}}, _) -> NM; (_, Acc2) -> Acc2 end, undefined, Attrs), CIDR = CIDRFun(CIDRFun, list_to_binary(tuple_to_list(NetMask)),0), CIDR; false -> Acc end end, undefined, MyIPs), case MyMask of undefined -> [{IP, Port}]; _ -> AddressMask = MaskAddress(NormIP, MyMask), Nodes = riak_core_node_watcher:nodes(riak_kv), {Results, _BadNodes} = rpc:multicall(Nodes,riak_repl_app, get_matching_address, [NormIP, AddressMask]), Results end end), riak_core_cluster_mgr:register_save_cluster_members_fun(fun(ClusterName, Members) -> riak_core_ring_manager:ring_trans(fun riak_repl_ring:set_clusterIpAddrs/2, {ClusterName, Members}) end), riak_core_cluster_mgr:register_restore_cluster_targets_fun(fun() -> {ok, Ring0} = riak_core_ring_manager:get_my_ring(), Ring = riak_repl_ring:ensure_config(Ring0), Clusters = riak_repl_ring:get_clusters(Ring), [{cluster_by_name, Name} || {Name, _Addrs} <- Clusters] end) end, []]).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment