From a56e48cfb8de35687028d448bdb2f1d8e86a08d4 Mon Sep 17 00:00:00 2001 From: lthms Date: Fri, 29 Dec 2017 21:03:12 +0000 Subject: puppeteer: Puppeteers now get digests from Instance they register to --- lib/lkn/core/instance.ex | 12 +++++++++++- lib/lkn/core/puppeteer.ex | 13 +++++++++++++ test/core_test.exs | 20 +++++++++++++++++++- 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 -- cgit v1.2.3