Advertisement
Guest User

Untitled

a guest
Jun 20th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.94 KB | None | 0 0
  1.  
  2. lookup(Key, Qref, Client, Id, {Pkey, _}, Successor, Store) ->
  3.     case key:between(Key, Pkey, Id) of
  4.         true ->
  5.             Result = storage:lookup(Key, Store),
  6.             Client ! {Qref, Result};
  7.         false ->
  8.             {_, Spid} = Successor,
  9.             Spid ! {lookup, Key, Qref, Client}
  10.     end.
  11.  
  12.  
  13.  
  14. notify({Nkey, Npid}, Id, Predecessor, Store) ->
  15.     case Predecessor of
  16.         nil ->
  17.             Keep = handover(Store, Nkey, Npid),
  18.             {Predecessor, Keep};
  19.         {Pkey, _} ->
  20.             case key:between(Nkey, Pkey, Id) of
  21.                 true ->
  22.                     Keep = handover(Store, Nkey, Npid),
  23.                     {{Nkey, Npid}, Keep};                  
  24.                 false ->
  25.                     Npid ! {status, Predecessor},
  26.                     {{Nkey, Npid}, Store}
  27.             end
  28.     end.
  29.  
  30.  
  31.  
  32. handover(Store, Nkey, Npid) ->
  33.     {Keep, Leave} = storage:split(Nkey, Store),
  34.     Npid ! {handover, Leave},
  35.     Keep.
  36.  
  37.  
  38. node(Id, Predecessor, Successor, Store) ->
  39.     receive
  40.         {key, Qref, Peer} ->
  41.             Peer ! {Qref, Id},
  42.             node(Id, Predecessor, Successor, Store);
  43.         {notify, New} ->
  44.             {Pred, Store2} = notify(New, Id, Predecessor, Store),
  45.             node(Id, Pred, Successor, Store2);
  46.         {request, Peer} ->
  47.             request(Peer, Predecessor),
  48.             node(Id, Predecessor, Successor, Store);
  49.         {status, Pred} ->
  50.             Succ = stabilize(Pred, Id, Successor),
  51.             node(Id, Predecessor, Succ, Store);
  52.         stabilize ->
  53.             stabilize(Successor),
  54.             node(Id, Predecessor, Successor, Store); %%node(Id, Predecessor, Successor, Store);
  55.         print ->
  56.             io:format("node ~w, pred ~w, succ ~w~n", [{Id,self()},Predecessor, Successor]),
  57.             node(Id, Predecessor, Successor, Store);
  58.         probe ->
  59.             io:format("node ~w, probe received~n", [Id]),
  60.             create_probe(Id, Successor),
  61.             node(Id, Predecessor, Successor, Store);
  62.         {probe, Start, TStart, Nodes} when Start == Id ->
  63.             remove_probe(Start, TStart, Nodes),
  64.             node(Id, Predecessor, Successor, Store);
  65.         {probe, Start, TStart, Nodes} ->
  66.             forward_probe(Id, Start, TStart, Nodes, Successor),
  67.             node(Id, Predecessor, Successor, Store);
  68.         {handover, Elements} ->
  69.             Merged = storage:merge(Store, Elements),
  70.             node(Id, Predecessor, Successor, Merged);
  71.         {add, Key, Value, Qref, Client} ->
  72.             io:format("Id: ~w Attempting to add key~n",[Id]),
  73.             Added = add(Key, Value, Qref, Client, Id, Predecessor, Successor, Store),
  74.             io:format("Id: ~w added key: ~w, Value:~w ", [Id, Key,Value]),
  75.             node(Id, Predecessor, Successor, Added);
  76.         {lookup, Key, Qref, Client} ->
  77.             lookup(Key, Qref, Client, Id, Predecessor, Successor, Store),
  78.             node(Id, Predecessor, Successor, Store);
  79.         stop ->
  80.             ok;
  81.         Error ->
  82.             io:format("node ~w, strange message ~w~n", [Id, Error]),
  83.             node(Id, Predecessor, Successor, Store)
  84.     end.
  85.  
  86.  
  87. notify({Nkey, Npid}, Id, Predecessor, Store) ->
  88.     case Predecessor of
  89.         nil ->
  90.             Keep = handover(Store, Nkey, Npid),
  91.             {Predecessor, Keep};
  92.         {Pkey, _} ->
  93.             case key:between(Nkey, Pkey, Id) of
  94.                 true ->
  95.                     Keep = handover(Store, Nkey, Npid),
  96.                     {{Nkey, Npid}, Keep};                  
  97.                 false ->
  98.                     Npid ! {status, Predecessor},
  99.                     {{Nkey, Npid}, Store}
  100.             end
  101.     end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement