Current section

34 Versions

Jump to

Compare versions

3 files changed
+18 additions
-12 deletions
  @@ -21,4 +21,4 @@
21 21 {<<"name">>,<<"gen_state_machine">>},
22 22 {<<"optional">>,false},
23 23 {<<"requirement">>,<<"~> 2.0">>}]]}.
24 - {<<"version">>,<<"3.0.3">>}.
24 + {<<"version">>,<<"3.0.4">>}.
  @@ -298,8 +298,20 @@ defmodule Swarm.Tracker do
298 298 GenStateMachine.cast(from, {:sync_ack, Node.self})
299 299 # load target registry
300 300 for entry(name: name, pid: pid, meta: meta, clock: clock) <- registry do
301 - ref = Process.monitor(pid)
302 - true = :ets.insert_new(:swarm_registry, entry(name: name, pid: pid, ref: ref, meta: meta, clock: clock))
301 + case Registry.get_by_name(name) do
302 + :undefined ->
303 + ref = Process.monitor(pid)
304 + true = :ets.insert_new(:swarm_registry, entry(name: name, pid: pid, ref: ref, meta: meta, clock: clock))
305 + entry(pid: ^pid, meta: ^meta) ->
306 + :ok
307 + entry(pid: ^pid, meta: old_meta) ->
308 + # Merge meta
309 + new_meta = Map.merge(old_meta, meta)
310 + :ets.update_element(:swarm_registry, name, [{entry(:meta)+1, new_meta}])
311 + entry(pid: _other_pid) ->
312 + # the local registration already exists, but for a differnt pid
313 + warn "conflicting registration for #{inspect name}!"
314 + end
303 315 end
304 316 # update our local clock to match remote clock
305 317 state = %{state | clock: clock}
  @@ -1089,14 +1101,8 @@ defmodule Swarm.Tracker do
1089 1101 _, {{:nodedown, _}, _} ->
1090 1102 warn "failed to start #{inspect name} on #{remote_node}: nodedown, retrying operation.."
1091 1103 new_state = %{state | nodes: state.nodes -- [remote_node], ring: HashRing.remove_node(state.ring, remote_node)}
1092 - current_node = Node.self
1093 - case HashRing.key_to_node(new_state.ring, name) do
1094 - ^current_node ->
1095 - reply = track(name, m, f, a)
1096 - GenStateMachine.reply(from, reply)
1097 - other_node ->
1098 - start_pid_remotely(other_node, from, name, m, f, a, new_state)
1099 - end
1104 + new_node = HashRing.key_to_node(new_state.ring, name)
1105 + start_pid_remotely(new_node, from, name, m, f, a, new_state)
1100 1106 kind, err when from != nil ->
1101 1107 error Exception.format(kind, err, System.stacktrace)
1102 1108 warn "failed to start #{inspect name} on #{remote_node}: #{inspect err}"
  @@ -13,7 +13,7 @@ defmodule Swarm.Mixfile do
13 13
14 14 def project do
15 15 [app: :swarm,
16 - version: "3.0.3",
16 + version: "3.0.4",
17 17 elixir: "~> 1.3",
18 18 elixirc_paths: elixirc_paths(Mix.env),
19 19 build_embedded: Mix.env == :prod,