]> Entropealabs - cluster_kv.git/commitdiff
only send init_node message on first start
authorChristopher <chris@entropealabs.com>
Sun, 8 Mar 2020 15:36:24 +0000 (10:36 -0500)
committerChristopher <chris@entropealabs.com>
Sun, 8 Mar 2020 15:36:24 +0000 (10:36 -0500)
lib/cluster_kv/ring.ex

index 6106cf64bbc5d3264dba0418c1c158c5fa790eaf..d7e077292330f69513f8f217b16e3800dde8bd13 100644 (file)
@@ -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(