{:module, KV, bytecode, _} =
defmodule KV do
use GenServer
def start do
{:ok, pid} = GenServer.start(__MODULE__, %{}, name: __MODULE__)
:ok = :pg.join(:kv_replicas, pid)
:ok
end
def put(key, value) do
for replica <- :pg.get_members(:kv_replicas) do
:ok = GenServer.call(replica, {:put, key, value})
end
:ok
end
def get(key), do: GenServer.call(__MODULE__, {:get, key})
@impl true
def init(map), do: {:ok, map}
@impl true
def handle_call({:put, k, v}, _from, map), do: {:reply, :ok, Map.put(map, k, v)}
def handle_call({:get, k}, _from, map), do: {:reply, Map.get(map, k), map}
end
for n <- [a, b],
do: {:module, KV} = :erpc.call(n, :code, :load_binary, [KV, ~c"nofile", bytecode])
{:ok, _} = :pg.start_link()
for n <- [a, b], do: {:ok, _} = :erpc.call(n, :pg, :start, [:pg])
for n <- nodes, do: :ok = :erpc.call(n, KV, :start, [])