119
119
start_link () ->
120
120
PeerService = application :get_env (plumtree , peer_service , partisan_peer_service ),
121
121
{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 = [],
123
128
plumtree_util :log (debug , " init peers, eager: ~p , lazy: ~p " ,
124
- [InitEagers , InitLazys ]),
129
+ [InitEagers , InitLazys ]),
125
130
Mods = app_helper :get_env (plumtree , broadcast_mods , []),
126
131
Res = start_link (Members , InitEagers , InitLazys , Mods ),
127
132
PeerService :add_sup_callback (fun ? MODULE :update /1 ),
@@ -289,7 +294,9 @@ handle_cast({graft, MessageId, Mod, Round, Root, From}, State) ->
289
294
plumtree_util :log (debug , " graft(~p ): ~p " , [MessageId , Result ]),
290
295
State1 = handle_graft (Result , MessageId , Mod , Round , Root , From , State ),
291
296
{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 }) ->
293
300
plumtree_util :log (debug , " received ~p " , [{update , Members }]),
294
301
CurrentMembers = ordsets :from_list (Members ),
295
302
New = ordsets :subtract (CurrentMembers , BroadcastMembers ),
@@ -300,7 +307,10 @@ handle_cast({update, Members}, State=#state{all_members=BroadcastMembers}) ->
300
307
false ->
301
308
State ;
302
309
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 ),
304
314
plumtree_util :log (debug , " new peers, eager: ~p , lazy: ~p " ,
305
315
[EagerPeers , LazyPeers ]),
306
316
reset_peers (CurrentMembers , EagerPeers , LazyPeers , State )
@@ -632,38 +642,6 @@ reset_peers(AllMembers, EagerPeers, LazyPeers, State) ->
632
642
all_members = ordsets :from_list (AllMembers )
633
643
}.
634
644
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
-
667
645
% % @private
668
646
myself () ->
669
647
node ().
0 commit comments