From a7879aa2f977e7a712ce7802a7c71672d6bb9e77 Mon Sep 17 00:00:00 2001 From: Christopher Date: Sun, 8 Mar 2020 10:36:24 -0500 Subject: [PATCH] only send init_node message on first start --- lib/cluster_kv/ring.ex | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/cluster_kv/ring.ex b/lib/cluster_kv/ring.ex index 6106cf6..d7e0772 100644 --- a/lib/cluster_kv/ring.ex +++ b/lib/cluster_kv/ring.ex @@ -13,6 +13,7 @@ defmodule ClusterKV.Ring do :ring, :db, :node, + init: true, requests: [], anti_entropy_interval: 5 * 60_000 ] @@ -22,6 +23,7 @@ defmodule ClusterKV.Ring do quorum: integer(), db: module(), node: node(), + init: boolean(), ring: HashRing.t(), anti_entropy_interval: integer() } @@ -36,6 +38,8 @@ defmodule ClusterKV.Ring do @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 @@ -97,7 +101,23 @@ defmodule ClusterKV.Ring 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() @@ -105,7 +125,15 @@ defmodule ClusterKV.Ring do 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( -- 2.45.3