Advertisement
Guest User

Untitled

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