119119start_link () ->
120120 PeerService = application :get_env (plumtree , peer_service , partisan_peer_service ),
121121 {ok , Members } = PeerService :members (),
122- {InitEagers , InitLazys } = init_peers (Members ),
122+ plumtree_util :log (debug , " peer sampling service members: ~p " , [Members ]),
123+ % % the peer service has already sampled the members, we start off
124+ % % with pure gossip (ie. all members are in the eager push list and lazy
125+ % % list is empty)
126+ InitEagers = Members ,
127+ InitLazys = [],
123128 plumtree_util :log (debug , " init peers, eager: ~p , lazy: ~p " ,
124- [InitEagers , InitLazys ]),
129+ [InitEagers , InitLazys ]),
125130 Mods = app_helper :get_env (plumtree , broadcast_mods , []),
126131 Res = start_link (Members , InitEagers , InitLazys , Mods ),
127132 PeerService :add_sup_callback (fun ? MODULE :update /1 ),
@@ -289,7 +294,9 @@ handle_cast({graft, MessageId, Mod, Round, Root, From}, State) ->
289294 plumtree_util :log (debug , " graft(~p ): ~p " , [MessageId , Result ]),
290295 State1 = handle_graft (Result , MessageId , Mod , Round , Root , From , State ),
291296 {noreply , State1 };
292- handle_cast ({update , Members }, State = # state {all_members = BroadcastMembers }) ->
297+ handle_cast ({update , Members }, State = # state {all_members = BroadcastMembers ,
298+ common_eagers = EagerPeers0 ,
299+ common_lazys = LazyPeers }) ->
293300 plumtree_util :log (debug , " received ~p " , [{update , Members }]),
294301 CurrentMembers = ordsets :from_list (Members ),
295302 New = ordsets :subtract (CurrentMembers , BroadcastMembers ),
@@ -300,7 +307,10 @@ handle_cast({update, Members}, State=#state{all_members=BroadcastMembers}) ->
300307 false ->
301308 State ;
302309 true ->
303- {EagerPeers , LazyPeers } = init_peers (CurrentMembers ),
310+ % % as per the paper (page 9):
311+ % % "When a new member is detected, it is simply added to the set
312+ % % of eagerPushPeers"
313+ EagerPeers = ordsets :union (EagerPeers0 , New ),
304314 plumtree_util :log (debug , " new peers, eager: ~p , lazy: ~p " ,
305315 [EagerPeers , LazyPeers ]),
306316 reset_peers (CurrentMembers , EagerPeers , LazyPeers , State )
@@ -632,38 +642,6 @@ reset_peers(AllMembers, EagerPeers, LazyPeers, State) ->
632642 all_members = ordsets :from_list (AllMembers )
633643 }.
634644
635- init_peers (Members ) ->
636- case length (Members ) of
637- 1 ->
638- % % Single member, must be ourselves
639- InitEagers = [],
640- InitLazys = [];
641- 2 ->
642- % % Two members, just eager push to the other
643- InitEagers = Members -- [myself ()],
644- InitLazys = [];
645- N when N < 5 ->
646- % % 2 to 4 members, start with a fully connected tree
647- % % with cycles. it will be adjusted as needed
648- Tree = plumtree_util :build_tree (1 , Members , [cycles ]),
649- InitEagers = orddict :fetch (myself (), Tree ),
650- InitLazys = [lists :nth (rand_compat :uniform (N - 2 ), Members -- [myself () | InitEagers ])];
651- N when N < 10 ->
652- % % 5 to 9 members, start with gossip tree used by
653- % % riak_core_gossip. it will be adjusted as needed
654- Tree = plumtree_util :build_tree (2 , Members , [cycles ]),
655- InitEagers = orddict :fetch (myself (), Tree ),
656- InitLazys = [lists :nth (rand_compat :uniform (N - 3 ), Members -- [myself () | InitEagers ])];
657- N ->
658- % % 10 or more members, use a tree similar to riak_core_gossip
659- % % but with higher fanout (larger initial eager set size)
660- NEagers = round (math :log (N ) + 1 ),
661- Tree = plumtree_util :build_tree (NEagers , Members , [cycles ]),
662- InitEagers = orddict :fetch (myself (), Tree ),
663- InitLazys = [lists :nth (rand_compat :uniform (N - (NEagers + 1 )), Members -- [myself () | InitEagers ])]
664- end ,
665- {InitEagers , InitLazys }.
666-
667645% % @private
668646myself () ->
669647 node ().
0 commit comments