aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlthms <contact@thomasletan.fr>2017-12-29 21:03:12 +0000
committerThomas Letan <contact@thomasletan.fr>2018-01-24 08:11:28 +0100
commita56e48cfb8de35687028d448bdb2f1d8e86a08d4 (patch)
tree7ba0c2530987cb2e1c50e1a2f24b33ee63439c01
parentpuppeteer: Add stop/2 and stop/1 to kill a given Puppeteer (diff)
puppeteer: Puppeteers now get digests from Instance they register to
-rw-r--r--lib/lkn/core/instance.ex12
-rw-r--r--lib/lkn/core/puppeteer.ex13
-rw-r--r--test/core_test.exs20
3 files changed, 43 insertions, 2 deletions
diff --git a/lib/lkn/core/instance.ex b/lib/lkn/core/instance.ex
index 4e8b93e..2b42c01 100644
--- a/lib/lkn/core/instance.ex
+++ b/lib/lkn/core/instance.ex
@@ -283,7 +283,17 @@ defmodule Lkn.Core.Instance do
end
def handle_call({:register_puppeteer, puppeteer_key, puppeteer_module}, _from, state) do
if !State.closed?(state) do
- {:reply, true, State.register_puppeteer(state, puppeteer_key, puppeteer_module)}
+ # we remember this new puppeteer
+ s2 = State.register_puppeteer(state, puppeteer_key, puppeteer_module)
+
+ # we compute a digest of the map and each puppets
+ map = Lkn.Core.Entity.digest(state.map_key)
+ puppets = Enum.map(state.puppets, &Lkn.Core.Entity.digest(&1))
+
+ # we send these digest to our new friend the puppeteer
+ Lkn.Core.Puppeteer.instance_digest(puppeteer_key, state.instance_key, map, puppets)
+
+ {:reply, true, s2}
else
{:reply, false, state}
end
diff --git a/lib/lkn/core/puppeteer.ex b/lib/lkn/core/puppeteer.ex
index 6433b49..f362c4f 100644
--- a/lib/lkn/core/puppeteer.ex
+++ b/lib/lkn/core/puppeteer.ex
@@ -127,6 +127,14 @@ defmodule Lkn.Core.Puppeteer do
{:noreply, state}
end
end
+ def handle_cast({:instance_digest, instance_key, map, puppets}, state) do
+ if state.instance_key == Lkn.Prelude.Option.some(instance_key) do
+ s2 = instance_digest(state.state, instance_key, map, puppets)
+ {:noreply, %State{state|state: s2}}
+ else
+ {:noreply, state}
+ end
+ end
def handle_cast({:leave_instance, instance_key}, state) do
if state.instance_key == Lkn.Prelude.Option.some(instance_key) do
s2 = leave_instance(state.state, instance_key)
@@ -184,6 +192,7 @@ defmodule Lkn.Core.Puppeteer do
@callback puppet_enter(s :: state, instance_key :: Lkn.Core.Instance.k, puppet_key :: Lkn.Core.Puppet.k, digest :: Lkn.Core.Entity.digest) :: state
@callback puppet_leave(s :: state, instance_key :: Lkn.Core.Instance.k, puppet_key :: Lkn.Core.Puppet.k) :: state
@callback destroy(puppeteer_key :: k, s :: state, instance_key :: Option.t(Lkn.Core.Instance.k), reason :: any) :: term
+ @callback instance_digest(s :: state, instance_key :: Lkn.Core.Instance, map :: Lkn.Core.Entity.digest, puppets :: Lkn.Core.Entity.digest) :: state
@spec leave_instance(k, Instance.k) :: :ok
def leave_instance(puppeteer_key, instance_key) do
@@ -195,6 +204,10 @@ defmodule Lkn.Core.Puppeteer do
GenServer.call(Name.puppeteer(puppeteer_key), {:find_instance, map_key})
end
+ def instance_digest(puppeteer_key, instance_key, map, puppets) do
+ GenServer.cast(Name.puppeteer(puppeteer_key), {:instance_digest, instance_key, map, puppets})
+ end
+
def puppet_enter(puppeteer_key, instance_key, puppet_key, digest) do
GenServer.cast(Name.puppeteer(puppeteer_key), {:puppet_enter, instance_key, puppet_key, digest})
end
diff --git a/test/core_test.exs b/test/core_test.exs
index 4949bda..7263d15 100644
--- a/test/core_test.exs
+++ b/test/core_test.exs
@@ -114,13 +114,27 @@ defmodule Lkn.Core.Test do
test "spawning everything" do
map_key = UUID.uuid4()
puppeteer_key = UUID.uuid4()
+ puppeteer_key2 = UUID.uuid4()
{:ok, _} = Test.Puppeteer.start_link(puppeteer_key)
+ {:ok, _} = Test.Puppeteer.start_link(puppeteer_key2)
{:ok, _} = Test.Map.start_link(map_key)
:ok = Lkn.Core.Pool.spawn_pool(map_key)
instance_key = Puppeteer.find_instance(puppeteer_key, map_key)
+ instance_key2 = Puppeteer.find_instance(puppeteer_key2, map_key)
+
+ assert instance_key == instance_key2
+
+ Lkn.Core.Puppeteer.leave_instance(puppeteer_key2, instance_key)
+
+ receive do
+ :kick -> :ok
+ after 100 -> assert false
+ end
+
+ Process.sleep 10
entity_key = UUID.uuid4()
ghost_key = UUID.uuid4()
@@ -141,7 +155,7 @@ defmodule Lkn.Core.Test do
1 = Lkn.Core.System.population_size(instance_key, Test.System)
receive do
- _ -> assert false
+ x -> raise "we have received #{inspect x}, when we shouldn’t"
after 100 -> :ok
end
@@ -502,6 +516,10 @@ defmodule Test.Puppeteer do
{:ok, s}
end
+ def instance_digest(state, _instance_key, map, puppets) do
+ state
+ end
+
def puppet_enter(state, _instance_key, _puppet_key, _digest) do
state
end