Paxos version 1
This commit is contained in:
54
lib/mix/tasks/test_leader_elector.ex
Normal file
54
lib/mix/tasks/test_leader_elector.ex
Normal file
@@ -0,0 +1,54 @@
|
||||
defmodule Mix.Tasks.TestLeaderElector do
|
||||
use Mix.Task
|
||||
|
||||
def run(_) do
|
||||
IO.puts("Testing Leader Elector")
|
||||
|
||||
procs = Enum.map(1..20, fn i -> String.to_atom("p#{i}") end)
|
||||
pids = Enum.map(procs, fn p -> start(p, procs) end)
|
||||
|
||||
IO.puts("spawned")
|
||||
|
||||
Process.send_after(self(), {:end}, 50000)
|
||||
|
||||
receive do
|
||||
{:end} ->
|
||||
IO.puts("test ended")
|
||||
end
|
||||
end
|
||||
|
||||
def start(name, procs) do
|
||||
pid = spawn(Mix.Tasks.TestLeaderElector, :init, [name, procs])
|
||||
|
||||
case :global.re_register_name(name, pid) do
|
||||
:yes ->
|
||||
# Note this is running on the parent so we are linking the parent to the rb
|
||||
# so that when we close the parent the rb also dies
|
||||
pid
|
||||
|
||||
:no ->
|
||||
:error
|
||||
end
|
||||
end
|
||||
|
||||
def init(name, procs) do
|
||||
IO.puts("#{name}: init")
|
||||
EventualLeaderElector.start(name, procs)
|
||||
|
||||
run_test(name)
|
||||
end
|
||||
|
||||
def run_test(name) do
|
||||
receive do
|
||||
{:ele_trust, proc} ->
|
||||
IO.puts("#{name}: trust process #{Atom.to_string(proc)}")
|
||||
|
||||
if proc == name do
|
||||
IO.puts("#{name}: Trust myself will stop\n\n\n")
|
||||
Process.exit(self(), :exit)
|
||||
end
|
||||
end
|
||||
|
||||
run_test(name)
|
||||
end
|
||||
end
|
||||
47
lib/mix/tasks/test_paxos.ex
Normal file
47
lib/mix/tasks/test_paxos.ex
Normal file
@@ -0,0 +1,47 @@
|
||||
defmodule Mix.Tasks.TestPaxos do
|
||||
use Mix.Task
|
||||
|
||||
def run(_) do
|
||||
IO.puts("Testing Paxos")
|
||||
|
||||
procs = Enum.map(0..3, fn i -> String.to_atom("p#{i}") end)
|
||||
_pids = Enum.map(procs, fn p -> start(p, procs) end)
|
||||
|
||||
IO.puts("spawned")
|
||||
|
||||
Process.send_after(self(), {:end}, 50000)
|
||||
|
||||
receive do
|
||||
{:end} ->
|
||||
IO.puts("test ended")
|
||||
end
|
||||
end
|
||||
|
||||
def start(name, procs) do
|
||||
pid = spawn(Mix.Tasks.TestPaxos, :init, [name, procs])
|
||||
|
||||
Utils.register_name(name, pid)
|
||||
end
|
||||
|
||||
def init(name, procs) do
|
||||
IO.puts("#{name}: init")
|
||||
Paxos.start(name, procs)
|
||||
|
||||
Process.sleep(200)
|
||||
|
||||
if name == :p0 do
|
||||
Paxos.propose(name, "Hi I was decided")
|
||||
end
|
||||
|
||||
run_test(name)
|
||||
end
|
||||
|
||||
def run_test(name) do
|
||||
receive do
|
||||
{:decide, value} ->
|
||||
IO.puts("#{name}: decide #{value}")
|
||||
end
|
||||
|
||||
run_test(name)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user