Packages
(BETA) Distributed shared dictionary using master/slave replication and slave to master failover
Current section
Files
Jump to
Current section
Files
lib/distributed_attribute_server/slave.ex
defmodule DistributedAttributeServer.Slave do
defmacro __using__(_opts) do
quote do
alias DistributedAttributeServer.States.MasterState, as: MasterState
alias DistributedAttributeServer.States.SlaveState, as: SlaveState
def init_slave do
unless master? do
unless SlaveState.marked?(__MODULE__) do
MasterState.remove_component __MODULE__
SlaveState.mark_component __MODULE__
log "SELF: becoming slave"
{:ok, pid} = :gen_server.start_link(__MODULE__, %{}, [])
unless registered_locally? do
Process.register pid, __MODULE__
end
receive_pid = spawn fn -> slave_listen end
send master_receive_pid, {receive_pid, :subscribe}
{:ok, pid}
end
end
end
def slave_listen do
unless master? do
receive do
{:set, attr, value} ->
log "SLAVE LISTENER: got `set` #{:i.i attr}=#{:i.i value} from master broadcast"
set_local(attr, value)
{:set_all, attributes} ->
log "SLAVE LISTENER: got `set_all` #{:i.i attributes} from master broadcast"
set_all_local attributes
{:clear} ->
log "SLAVE LISTENER: got `clear` from master broadcast"
clear_local
_ ->
IO.puts :stderr, "Unexpected message received"
end
slave_listen
end
end
end
end
end