Skip to content

Commit 1ae8de3

Browse files
committed
Obtain eager/lazy peers from peer service
Instead of relying on a custom built tree use the membership provided by partisan. Directly add new members to the eager push list as per the paper.
1 parent 91a97da commit 1ae8de3

File tree

1 file changed

+14
-36
lines changed

1 file changed

+14
-36
lines changed

src/plumtree_broadcast.erl

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,14 @@
119119
start_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
668646
myself() ->
669647
node().

0 commit comments

Comments
 (0)