2020% %
2121% % -------------------------------------------------------------------
2222-module (riak_core ).
23- -export ([stop /0 , stop /1 , join /1 , join /4 , remove /1 , down /1 , leave / 0 ,
24- remove_from_cluster /1 ]).
23+ -export ([stop /0 , stop /1 , join /1 , join /5 , staged_join /1 , remove /1 , down / 1 ,
24+ leave / 0 , remove_from_cluster /1 ]).
2525-export ([vnode_modules /0 ]).
2626-export ([register /1 , register /2 , bucket_fixups /0 , bucket_validators /0 ]).
2727
@@ -54,19 +54,28 @@ stop(Reason) ->
5454% %
5555% % @doc Join the ring found on the specified remote node
5656% %
57- join (NodeStr ) when is_list (NodeStr ) ->
58- join (riak_core_util :str_to_node (NodeStr ));
59- join (Node ) when is_atom (Node ) ->
60- join (node (), Node ).
57+ join (Node ) ->
58+ join (Node , true ).
6159
62- join (Node , Node ) ->
60+ % % @doc Join the remote cluster without automatically claiming ring
61+ % % ownership. Used to stage a join in the newer plan/commit
62+ % % approach to cluster administration. See {@link riak_core_claimant}
63+ staged_join (Node ) ->
64+ join (Node , false ).
65+
66+ join (NodeStr , Auto ) when is_list (NodeStr ) ->
67+ join (riak_core_util :str_to_node (NodeStr ), Auto );
68+ join (Node , Auto ) when is_atom (Node ) ->
69+ join (node (), Node , Auto ).
70+
71+ join (Node , Node , _ ) ->
6372 {error , self_join };
64- join (_ , Node ) ->
65- join (riak_core_gossip :legacy_gossip (), node (), Node , false ).
73+ join (_ , Node , Auto ) ->
74+ join (riak_core_gossip :legacy_gossip (), node (), Node , false , Auto ).
6675
67- join (true , _ , Node , _Rejoin ) ->
76+ join (true , _ , Node , _Rejoin , _Auto ) ->
6877 legacy_join (Node );
69- join (false , _ , Node , Rejoin ) ->
78+ join (false , _ , Node , Rejoin , Auto ) ->
7079 case net_adm :ping (Node ) of
7180 pang ->
7281 {error , not_reachable };
@@ -78,7 +87,7 @@ join(false, _, Node, Rejoin) ->
7887 % % Failure due to trying to join older node that
7988 % % doesn't define legacy_gossip will be handled
8089 % % in standard_join based on seeing a legacy ring.
81- standard_join (Node , Rejoin )
90+ standard_join (Node , Rejoin , Auto )
8291 end
8392 end .
8493
@@ -95,7 +104,7 @@ get_other_ring(Node) ->
95104 Error
96105 end .
97106
98- standard_join (Node , Rejoin ) when is_atom (Node ) ->
107+ standard_join (Node , Rejoin , Auto ) when is_atom (Node ) ->
99108 case net_adm :ping (Node ) of
100109 pong ->
101110 case get_other_ring (Node ) of
@@ -104,7 +113,7 @@ standard_join(Node, Rejoin) when is_atom(Node) ->
104113 true ->
105114 legacy_join (Node );
106115 false ->
107- standard_join (Node , Ring , Rejoin )
116+ standard_join (Node , Ring , Rejoin , Auto )
108117 end ;
109118 _ ->
110119 {error , unable_to_get_join_ring }
@@ -113,7 +122,7 @@ standard_join(Node, Rejoin) when is_atom(Node) ->
113122 {error , not_reachable }
114123 end .
115124
116- standard_join (Node , Ring , Rejoin ) ->
125+ standard_join (Node , Ring , Rejoin , Auto ) ->
117126 {ok , MyRing } = riak_core_ring_manager :get_raw_ring (),
118127 SameSize = (riak_core_ring :num_partitions (MyRing ) =:=
119128 riak_core_ring :num_partitions (Ring )),
@@ -135,10 +144,16 @@ standard_join(Node, Ring, Rejoin) ->
135144 gossip_vsn ,
136145 GossipVsn ),
137146 {_ , Ring5 } = riak_core_capability :update_ring (Ring4 ),
138- riak_core_ring_manager :set_my_ring (Ring5 ),
147+ Ring6 = maybe_auto_join (Auto , node (), Ring5 ),
148+ riak_core_ring_manager :set_my_ring (Ring6 ),
139149 riak_core_gossip :send_ring (Node , node ())
140150 end .
141151
152+ maybe_auto_join (false , _Node , Ring ) ->
153+ Ring ;
154+ maybe_auto_join (true , Node , Ring ) ->
155+ riak_core_ring :update_member_meta (Node , Ring , Node , '$autojoin' , true ).
156+
142157legacy_join (Node ) when is_atom (Node ) ->
143158 {ok , OurRingSize } = application :get_env (riak_core , ring_creation_size ),
144159 case net_adm :ping (Node ) of
0 commit comments