:ring,
:db,
:node,
+ init: true,
requests: [],
anti_entropy_interval: 5 * 60_000
]
quorum: integer(),
db: module(),
node: node(),
+ init: boolean(),
ring: HashRing.t(),
anti_entropy_interval: integer()
}
@handle_init "HandleInit"
@handle_ready "HandleReady"
@await_quorum "AwaitQuorum"
+ @handle_node_up "HandleNodeUp"
+ @handle_node_down "HandleNodeDown"
@handle_anti_entropy "HandleAntiEntropy"
def put(name, key, value) do
{:ok, sl, actions}
end
- def handle_resource(@handle_ready, _, @ready, %SL{data: %Ring{name: name, node: me}} = sl) do
+ def handle_resource(
+ @handle_ready,
+ _,
+ @ready,
+ %SL{data: %Ring{init: false}} = sl
+ ) do
+ Logger.info("Ready")
+
+ {:ok, sl, []}
+ end
+
+ def handle_resource(
+ @handle_ready,
+ _,
+ @ready,
+ %SL{data: %Ring{init: true, name: name, node: me} = data} = sl
+ ) do
Logger.info("Ready")
nodes = Node.list()
send({name, n}, {:init_node, me})
end)
- {:ok, sl, []}
+ {:ok, %SL{sl | data: %Ring{data | init: false}}, []}
+ end
+
+ def handle_resource(@handle_node_up, _, _, sl) do
+ {:ok, sl, [{:next_event, :internal, :node_added}]}
+ end
+
+ def handle_resource(@handle_node_down, _, _, sl) do
+ {:ok, sl, [{:next_event, :internal, :node_removed}]}
end
def handle_call(